centy 0.0.24 → 0.0.25

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/dist/commands/add/plan.d.ts +18 -0
  2. package/dist/commands/add/plan.d.ts.map +1 -0
  3. package/dist/commands/add/plan.js +87 -0
  4. package/dist/commands/add/plan.js.map +1 -0
  5. package/dist/commands/assign/issue.d.ts +19 -0
  6. package/dist/commands/assign/issue.d.ts.map +1 -0
  7. package/dist/commands/assign/issue.js +79 -0
  8. package/dist/commands/assign/issue.js.map +1 -0
  9. package/dist/commands/create/user.d.ts +18 -0
  10. package/dist/commands/create/user.d.ts.map +1 -0
  11. package/dist/commands/create/user.js +85 -0
  12. package/dist/commands/create/user.js.map +1 -0
  13. package/dist/commands/delete/plan.d.ts +17 -0
  14. package/dist/commands/delete/plan.d.ts.map +1 -0
  15. package/dist/commands/delete/plan.js +74 -0
  16. package/dist/commands/delete/plan.js.map +1 -0
  17. package/dist/commands/delete/user.d.ts +17 -0
  18. package/dist/commands/delete/user.d.ts.map +1 -0
  19. package/dist/commands/delete/user.js +73 -0
  20. package/dist/commands/delete/user.js.map +1 -0
  21. package/dist/commands/get/plan.d.ts +18 -0
  22. package/dist/commands/get/plan.d.ts.map +1 -0
  23. package/dist/commands/get/plan.js +68 -0
  24. package/dist/commands/get/plan.js.map +1 -0
  25. package/dist/commands/get/user.d.ts +17 -0
  26. package/dist/commands/get/user.d.ts.map +1 -0
  27. package/dist/commands/get/user.js +75 -0
  28. package/dist/commands/get/user.js.map +1 -0
  29. package/dist/commands/init.d.ts +7 -0
  30. package/dist/commands/init.d.ts.map +1 -1
  31. package/dist/commands/init.js +43 -1
  32. package/dist/commands/init.js.map +1 -1
  33. package/dist/commands/list/users.d.ts +15 -0
  34. package/dist/commands/list/users.d.ts.map +1 -0
  35. package/dist/commands/list/users.js +67 -0
  36. package/dist/commands/list/users.js.map +1 -0
  37. package/dist/commands/project/title.d.ts +19 -0
  38. package/dist/commands/project/title.d.ts.map +1 -0
  39. package/dist/commands/project/title.js +76 -0
  40. package/dist/commands/project/title.js.map +1 -0
  41. package/dist/commands/sync/users.d.ts +17 -0
  42. package/dist/commands/sync/users.d.ts.map +1 -0
  43. package/dist/commands/sync/users.js +105 -0
  44. package/dist/commands/sync/users.js.map +1 -0
  45. package/dist/commands/unassign/issue.d.ts +19 -0
  46. package/dist/commands/unassign/issue.d.ts.map +1 -0
  47. package/dist/commands/unassign/issue.js +79 -0
  48. package/dist/commands/unassign/issue.js.map +1 -0
  49. package/dist/commands/update/user.d.ts +20 -0
  50. package/dist/commands/update/user.d.ts.map +1 -0
  51. package/dist/commands/update/user.js +88 -0
  52. package/dist/commands/update/user.js.map +1 -0
  53. package/dist/daemon/daemon-assign-issue.d.ts +6 -0
  54. package/dist/daemon/daemon-assign-issue.d.ts.map +1 -0
  55. package/dist/daemon/daemon-assign-issue.js +17 -0
  56. package/dist/daemon/daemon-assign-issue.js.map +1 -0
  57. package/dist/daemon/daemon-create-user.d.ts +6 -0
  58. package/dist/daemon/daemon-create-user.d.ts.map +1 -0
  59. package/dist/daemon/daemon-create-user.js +17 -0
  60. package/dist/daemon/daemon-create-user.js.map +1 -0
  61. package/dist/daemon/daemon-delete-plan.d.ts +6 -0
  62. package/dist/daemon/daemon-delete-plan.d.ts.map +1 -0
  63. package/dist/daemon/daemon-delete-plan.js +17 -0
  64. package/dist/daemon/daemon-delete-plan.js.map +1 -0
  65. package/dist/daemon/daemon-delete-user.d.ts +6 -0
  66. package/dist/daemon/daemon-delete-user.d.ts.map +1 -0
  67. package/dist/daemon/daemon-delete-user.js +17 -0
  68. package/dist/daemon/daemon-delete-user.js.map +1 -0
  69. package/dist/daemon/daemon-get-plan.d.ts +6 -0
  70. package/dist/daemon/daemon-get-plan.d.ts.map +1 -0
  71. package/dist/daemon/daemon-get-plan.js +17 -0
  72. package/dist/daemon/daemon-get-plan.js.map +1 -0
  73. package/dist/daemon/daemon-get-user.d.ts +6 -0
  74. package/dist/daemon/daemon-get-user.d.ts.map +1 -0
  75. package/dist/daemon/daemon-get-user.js +17 -0
  76. package/dist/daemon/daemon-get-user.js.map +1 -0
  77. package/dist/daemon/daemon-list-users.d.ts +6 -0
  78. package/dist/daemon/daemon-list-users.d.ts.map +1 -0
  79. package/dist/daemon/daemon-list-users.js +17 -0
  80. package/dist/daemon/daemon-list-users.js.map +1 -0
  81. package/dist/daemon/daemon-set-project-title.d.ts +7 -0
  82. package/dist/daemon/daemon-set-project-title.d.ts.map +1 -0
  83. package/dist/daemon/daemon-set-project-title.js +18 -0
  84. package/dist/daemon/daemon-set-project-title.js.map +1 -0
  85. package/dist/daemon/daemon-set-project-user-title.d.ts +7 -0
  86. package/dist/daemon/daemon-set-project-user-title.d.ts.map +1 -0
  87. package/dist/daemon/daemon-set-project-user-title.js +18 -0
  88. package/dist/daemon/daemon-set-project-user-title.js.map +1 -0
  89. package/dist/daemon/daemon-sync-users.d.ts +6 -0
  90. package/dist/daemon/daemon-sync-users.d.ts.map +1 -0
  91. package/dist/daemon/daemon-sync-users.js +17 -0
  92. package/dist/daemon/daemon-sync-users.js.map +1 -0
  93. package/dist/daemon/daemon-unassign-issue.d.ts +6 -0
  94. package/dist/daemon/daemon-unassign-issue.d.ts.map +1 -0
  95. package/dist/daemon/daemon-unassign-issue.js +17 -0
  96. package/dist/daemon/daemon-unassign-issue.js.map +1 -0
  97. package/dist/daemon/daemon-update-plan.d.ts +6 -0
  98. package/dist/daemon/daemon-update-plan.d.ts.map +1 -0
  99. package/dist/daemon/daemon-update-plan.js +17 -0
  100. package/dist/daemon/daemon-update-plan.js.map +1 -0
  101. package/dist/daemon/daemon-update-user.d.ts +6 -0
  102. package/dist/daemon/daemon-update-user.d.ts.map +1 -0
  103. package/dist/daemon/daemon-update-user.js +17 -0
  104. package/dist/daemon/daemon-update-user.js.map +1 -0
  105. package/dist/daemon/load-proto.d.ts +15 -1
  106. package/dist/daemon/load-proto.d.ts.map +1 -1
  107. package/dist/daemon/load-proto.js.map +1 -1
  108. package/dist/daemon/types.d.ts +169 -0
  109. package/dist/daemon/types.d.ts.map +1 -1
  110. package/dist/lib/init/init.d.ts +7 -0
  111. package/dist/lib/init/init.d.ts.map +1 -1
  112. package/dist/lib/init/init.js +51 -1
  113. package/dist/lib/init/init.js.map +1 -1
  114. package/dist/lib/install-daemon/github-api.d.ts.map +1 -1
  115. package/dist/lib/install-daemon/github-api.js +50 -39
  116. package/dist/lib/install-daemon/github-api.js.map +1 -1
  117. package/dist/tui/components/domain/AssetList.js +1 -3
  118. package/dist/tui/components/domain/AssetList.js.map +1 -1
  119. package/dist/tui/components/domain/ConfigPanel.js +1 -3
  120. package/dist/tui/components/domain/ConfigPanel.js.map +1 -1
  121. package/dist/tui/components/domain/DocCreate.d.ts.map +1 -1
  122. package/dist/tui/components/domain/DocCreate.js +1 -3
  123. package/dist/tui/components/domain/DocCreate.js.map +1 -1
  124. package/dist/tui/components/domain/IssueCreate.js +1 -7
  125. package/dist/tui/components/domain/IssueCreate.js.map +1 -1
  126. package/dist/tui/components/domain/IssueEdit.d.ts.map +1 -1
  127. package/dist/tui/components/domain/IssueEdit.js +1 -9
  128. package/dist/tui/components/domain/IssueEdit.js.map +1 -1
  129. package/dist/tui/components/domain/IssueList.js +1 -1
  130. package/dist/tui/components/domain/IssueList.js.map +1 -1
  131. package/dist/tui/components/domain/PRCreate.d.ts.map +1 -1
  132. package/dist/tui/components/domain/PRCreate.js +1 -13
  133. package/dist/tui/components/domain/PRCreate.js.map +1 -1
  134. package/dist/tui/components/domain/PREdit.d.ts.map +1 -1
  135. package/dist/tui/components/domain/PREdit.js +1 -13
  136. package/dist/tui/components/domain/PREdit.js.map +1 -1
  137. package/dist/tui/components/domain/PRList.js +1 -1
  138. package/dist/tui/components/domain/PRList.js.map +1 -1
  139. package/dist/tui/components/domain/ProjectList.js +1 -3
  140. package/dist/tui/components/domain/ProjectList.js.map +1 -1
  141. package/dist/tui/components/layout/Sidebar.js +1 -1
  142. package/dist/tui/components/layout/Sidebar.js.map +1 -1
  143. package/dist/types/init-options.d.ts +14 -0
  144. package/dist/types/init-options.d.ts.map +1 -1
  145. package/oclif.manifest.json +721 -24
  146. package/package.json +2 -1
  147. package/proto/centy.proto +226 -0
@@ -0,0 +1,18 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * Add or update an issue's plan
4
+ */
5
+ export default class AddPlan extends Command {
6
+ static aliases: string[];
7
+ static args: {
8
+ issueId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
9
+ };
10
+ static description: string;
11
+ static examples: string[];
12
+ static flags: {
13
+ file: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ };
16
+ run(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/commands/add/plan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAUlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAE1C,OAAgB,OAAO,WAA8B;IAGrD,OAAgB,IAAI;;MAKnB;IAGD,OAAgB,WAAW,SAAkC;IAG7D,OAAgB,QAAQ,WAKvB;IAGD,OAAgB,KAAK;;;MAMpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiDlC"}
@@ -0,0 +1,87 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ // eslint-disable-next-line import/order
3
+ import { Args, Command, Flags } from '@oclif/core';
4
+ import { daemonUpdatePlan } from '../../daemon/daemon-update-plan.js';
5
+ import { projectFlag } from '../../flags/project-flag.js';
6
+ import { ensureInitialized, NotInitializedError, } from '../../utils/ensure-initialized.js';
7
+ import { resolveProjectPath } from '../../utils/resolve-project-path.js';
8
+ /**
9
+ * Add or update an issue's plan
10
+ */
11
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
12
+ export default class AddPlan extends Command {
13
+ // eslint-disable-next-line no-restricted-syntax
14
+ static aliases = ['update:plan', 'set:plan'];
15
+ // eslint-disable-next-line no-restricted-syntax
16
+ static args = {
17
+ issueId: Args.string({
18
+ description: 'Issue ID or display number',
19
+ required: true,
20
+ }),
21
+ };
22
+ // eslint-disable-next-line no-restricted-syntax
23
+ static description = "Add or update an issue's plan";
24
+ // eslint-disable-next-line no-restricted-syntax
25
+ static examples = [
26
+ '<%= config.bin %> add plan 1 --file ./plan.md',
27
+ '<%= config.bin %> add plan abc123 --file ./plan.md',
28
+ 'echo "# Plan" | <%= config.bin %> add plan 1',
29
+ '<%= config.bin %> add plan 1 --project centy-daemon --file ./plan.md',
30
+ ];
31
+ // eslint-disable-next-line no-restricted-syntax
32
+ static flags = {
33
+ file: Flags.string({
34
+ char: 'f',
35
+ description: 'Path to the plan file (reads from stdin if not provided)',
36
+ }),
37
+ project: projectFlag,
38
+ };
39
+ async run() {
40
+ const { args, flags } = await this.parse(AddPlan);
41
+ const cwd = await resolveProjectPath(flags.project);
42
+ try {
43
+ await ensureInitialized(cwd);
44
+ }
45
+ catch (error) {
46
+ if (error instanceof NotInitializedError) {
47
+ this.error(error.message);
48
+ }
49
+ throw error instanceof Error ? error : new Error(String(error));
50
+ }
51
+ let content;
52
+ if (flags.file) {
53
+ try {
54
+ // eslint-disable-next-line security/detect-non-literal-fs-filename
55
+ content = await readFile(flags.file, 'utf-8');
56
+ }
57
+ catch (error) {
58
+ const msg = error instanceof Error ? error.message : String(error);
59
+ if (msg.includes('ENOENT')) {
60
+ this.error(`File not found: ${flags.file}`);
61
+ }
62
+ throw error instanceof Error ? error : new Error(String(error));
63
+ }
64
+ }
65
+ else if (!process.stdin.isTTY) {
66
+ // Read from stdin
67
+ const chunks = [];
68
+ for await (const chunk of process.stdin) {
69
+ chunks.push(Buffer.from(chunk));
70
+ }
71
+ content = Buffer.concat(chunks).toString('utf-8');
72
+ }
73
+ else {
74
+ this.error('No input provided. Use --file or pipe content via stdin.');
75
+ }
76
+ const response = await daemonUpdatePlan({
77
+ projectPath: cwd,
78
+ issueId: args.issueId,
79
+ content,
80
+ });
81
+ if (!response.success) {
82
+ this.error(response.error);
83
+ }
84
+ this.log(`Plan updated for issue ${args.issueId}`);
85
+ }
86
+ }
87
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/commands/add/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * Assign users to an issue
4
+ */
5
+ export default class AssignIssue extends Command {
6
+ static args: {
7
+ issueId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
+ userIds: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
9
+ };
10
+ static description: string;
11
+ static examples: string[];
12
+ static flags: {
13
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ };
16
+ static strict: boolean;
17
+ run(): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../../src/commands/assign/issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAUlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAE9C,OAAgB,IAAI;;;MASnB;IAGD,OAAgB,WAAW,SAA6B;IAGxD,OAAgB,QAAQ,WAIvB;IAGD,OAAgB,KAAK;;;MAMpB;IAGD,OAAgB,MAAM,UAAQ;IAEjB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8ClC"}
@@ -0,0 +1,79 @@
1
+ // eslint-disable-next-line import/order
2
+ import { Args, Command, Flags } from '@oclif/core';
3
+ import { daemonAssignIssue } from '../../daemon/daemon-assign-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';
7
+ /**
8
+ * Assign users to an issue
9
+ */
10
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
11
+ export default class AssignIssue extends Command {
12
+ // eslint-disable-next-line no-restricted-syntax
13
+ static args = {
14
+ issueId: Args.string({
15
+ description: 'Issue ID (UUID) or display number',
16
+ required: true,
17
+ }),
18
+ userIds: Args.string({
19
+ description: 'User IDs to assign (space-separated)',
20
+ required: true,
21
+ }),
22
+ };
23
+ // eslint-disable-next-line no-restricted-syntax
24
+ static description = 'Assign users to an issue';
25
+ // eslint-disable-next-line no-restricted-syntax
26
+ static examples = [
27
+ '<%= config.bin %> assign issue 1 john-doe',
28
+ '<%= config.bin %> assign issue abc123-uuid alice bob',
29
+ '<%= config.bin %> assign issue 1 john-doe --project centy-daemon',
30
+ ];
31
+ // eslint-disable-next-line no-restricted-syntax
32
+ static flags = {
33
+ json: Flags.boolean({
34
+ description: 'Output as JSON',
35
+ default: false,
36
+ }),
37
+ project: projectFlag,
38
+ };
39
+ // eslint-disable-next-line no-restricted-syntax
40
+ static strict = false;
41
+ async run() {
42
+ const { args, argv, flags } = await this.parse(AssignIssue);
43
+ const cwd = await resolveProjectPath(flags.project);
44
+ try {
45
+ await ensureInitialized(cwd);
46
+ }
47
+ catch (error) {
48
+ if (error instanceof NotInitializedError) {
49
+ this.error(error.message);
50
+ }
51
+ throw error instanceof Error ? error : new Error(String(error));
52
+ }
53
+ // Get all user IDs from argv (everything after the issue ID)
54
+ // eslint-disable-next-line no-restricted-syntax
55
+ const userIds = argv.slice(1);
56
+ if (userIds.length === 0) {
57
+ this.error('At least one user ID is required');
58
+ }
59
+ const response = await daemonAssignIssue({
60
+ projectPath: cwd,
61
+ issueId: args.issueId,
62
+ userIds,
63
+ });
64
+ if (!response.success) {
65
+ this.error(response.error);
66
+ }
67
+ if (flags.json) {
68
+ this.log(JSON.stringify(response.issue, null, 2));
69
+ return;
70
+ }
71
+ const issue = response.issue;
72
+ if (issue !== undefined) {
73
+ this.log(`Assigned ${userIds.join(', ')} to issue #${issue.displayNumber}`);
74
+ const assignees = issue.metadata.assignees;
75
+ this.log(`Current assignees: ${assignees.length > 0 ? assignees.join(', ') : 'none'}`);
76
+ }
77
+ }
78
+ }
79
+ //# sourceMappingURL=issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../../src/commands/assign/issue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * Create a new user in the project
4
+ */
5
+ export default class CreateUser extends Command {
6
+ static description: string;
7
+ static examples: string[];
8
+ static flags: {
9
+ id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ name: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
+ email: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ 'git-username': import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ };
16
+ run(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/commands/create/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAU5C;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAE7C,OAAgB,WAAW,SAAqC;IAGhE,OAAgB,QAAQ,WAKvB;IAGD,OAAgB,KAAK;;;;;;;MAyBpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyClC"}
@@ -0,0 +1,85 @@
1
+ // eslint-disable-next-line import/order
2
+ import { Command, Flags } from '@oclif/core';
3
+ import { daemonCreateUser } from '../../daemon/daemon-create-user.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
+ /**
8
+ * Create a new user in the project
9
+ */
10
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
11
+ export default class CreateUser extends Command {
12
+ // eslint-disable-next-line no-restricted-syntax
13
+ static description = 'Create a new user in the project';
14
+ // eslint-disable-next-line no-restricted-syntax
15
+ static examples = [
16
+ '<%= config.bin %> create user --name "John Doe"',
17
+ '<%= config.bin %> create user --id john-doe --name "John Doe" --email john@example.com',
18
+ '<%= config.bin %> create user -n "Alice" -g alice-dev -g alice-work',
19
+ '<%= config.bin %> create user --name "Bob" --project centy-daemon',
20
+ ];
21
+ // eslint-disable-next-line no-restricted-syntax
22
+ static flags = {
23
+ id: Flags.string({
24
+ char: 'i',
25
+ description: 'User ID (slug format, auto-generated from name if not provided)',
26
+ }),
27
+ name: Flags.string({
28
+ char: 'n',
29
+ description: 'Display name (required)',
30
+ required: true,
31
+ }),
32
+ email: Flags.string({
33
+ char: 'e',
34
+ description: 'Email address',
35
+ }),
36
+ 'git-username': Flags.string({
37
+ char: 'g',
38
+ description: 'Git username (can be specified multiple times)',
39
+ multiple: true,
40
+ }),
41
+ json: Flags.boolean({
42
+ description: 'Output as JSON',
43
+ default: false,
44
+ }),
45
+ project: projectFlag,
46
+ };
47
+ async run() {
48
+ const { flags } = await this.parse(CreateUser);
49
+ const cwd = await resolveProjectPath(flags.project);
50
+ try {
51
+ await ensureInitialized(cwd);
52
+ }
53
+ catch (error) {
54
+ if (error instanceof NotInitializedError) {
55
+ this.error(error.message);
56
+ }
57
+ throw error instanceof Error ? error : new Error(String(error));
58
+ }
59
+ const response = await daemonCreateUser({
60
+ projectPath: cwd,
61
+ id: flags.id !== undefined ? flags.id : '',
62
+ name: flags.name,
63
+ email: flags.email,
64
+ gitUsernames: flags['git-username'],
65
+ });
66
+ if (!response.success) {
67
+ this.error(response.error);
68
+ }
69
+ if (flags.json) {
70
+ this.log(JSON.stringify(response.user, null, 2));
71
+ return;
72
+ }
73
+ const user = response.user;
74
+ if (user !== undefined) {
75
+ this.log(`Created user: ${user.id} (${user.name})`);
76
+ if (user.email !== undefined && user.email !== '') {
77
+ this.log(` Email: ${user.email}`);
78
+ }
79
+ if (user.gitUsernames !== undefined && user.gitUsernames.length > 0) {
80
+ this.log(` Git usernames: ${user.gitUsernames.join(', ')}`);
81
+ }
82
+ }
83
+ }
84
+ }
85
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/commands/create/user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * Delete an issue's plan
4
+ */
5
+ export default class DeletePlan extends Command {
6
+ static args: {
7
+ issueId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ static description: string;
10
+ static examples: string[];
11
+ static flags: {
12
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ };
15
+ run(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/commands/delete/plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAUlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAE7C,OAAgB,IAAI;;MAKnB;IAGD,OAAgB,WAAW,SAA2B;IAGtD,OAAgB,QAAQ,WAKvB;IAGD,OAAgB,KAAK;;;MAOpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2ClC"}
@@ -0,0 +1,74 @@
1
+ // eslint-disable-next-line import/order
2
+ import { Args, Command, Flags } from '@oclif/core';
3
+ import { daemonDeletePlan } from '../../daemon/daemon-delete-plan.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
+ /**
8
+ * Delete an issue's plan
9
+ */
10
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
11
+ export default class DeletePlan extends Command {
12
+ // eslint-disable-next-line no-restricted-syntax
13
+ static args = {
14
+ issueId: Args.string({
15
+ description: 'Issue ID or display number',
16
+ required: true,
17
+ }),
18
+ };
19
+ // eslint-disable-next-line no-restricted-syntax
20
+ static description = "Delete an issue's plan";
21
+ // eslint-disable-next-line no-restricted-syntax
22
+ static examples = [
23
+ '<%= config.bin %> delete plan 1',
24
+ '<%= config.bin %> delete plan abc123',
25
+ '<%= config.bin %> delete plan 1 --force',
26
+ '<%= config.bin %> delete plan 1 --project centy-daemon',
27
+ ];
28
+ // eslint-disable-next-line no-restricted-syntax
29
+ static flags = {
30
+ force: Flags.boolean({
31
+ char: 'f',
32
+ description: 'Skip confirmation prompt',
33
+ default: false,
34
+ }),
35
+ project: projectFlag,
36
+ };
37
+ async run() {
38
+ const { args, flags } = await this.parse(DeletePlan);
39
+ const cwd = await resolveProjectPath(flags.project);
40
+ try {
41
+ await ensureInitialized(cwd);
42
+ }
43
+ catch (error) {
44
+ if (error instanceof NotInitializedError) {
45
+ this.error(error.message);
46
+ }
47
+ throw error instanceof Error ? error : new Error(String(error));
48
+ }
49
+ if (!flags.force) {
50
+ const readline = await import('node:readline');
51
+ const rl = readline.createInterface({
52
+ input: process.stdin,
53
+ output: process.stdout,
54
+ });
55
+ const answer = await new Promise(resolve => {
56
+ rl.question(`Are you sure you want to delete the plan for issue ${args.issueId}? (y/N) `, resolve);
57
+ });
58
+ rl.close();
59
+ if (answer.toLowerCase() !== 'y') {
60
+ this.log('Cancelled.');
61
+ return;
62
+ }
63
+ }
64
+ const response = await daemonDeletePlan({
65
+ projectPath: cwd,
66
+ issueId: args.issueId,
67
+ });
68
+ if (!response.success) {
69
+ this.error(response.error);
70
+ }
71
+ this.log(`Deleted plan for issue ${args.issueId}`);
72
+ }
73
+ }
74
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/commands/delete/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * Delete a user
4
+ */
5
+ export default class DeleteUser extends Command {
6
+ static args: {
7
+ id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ static description: string;
10
+ static examples: string[];
11
+ static flags: {
12
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ };
15
+ run(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/commands/delete/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAUlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAE7C,OAAgB,IAAI;;MAKnB;IAGD,OAAgB,WAAW,SAAkB;IAG7C,OAAgB,QAAQ,WAIvB;IAGD,OAAgB,KAAK;;;MAOpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2ClC"}
@@ -0,0 +1,73 @@
1
+ // eslint-disable-next-line import/order
2
+ import { Args, Command, Flags } from '@oclif/core';
3
+ import { daemonDeleteUser } from '../../daemon/daemon-delete-user.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
+ /**
8
+ * Delete a user
9
+ */
10
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
11
+ export default class DeleteUser extends Command {
12
+ // eslint-disable-next-line no-restricted-syntax
13
+ static args = {
14
+ id: Args.string({
15
+ description: 'User ID',
16
+ required: true,
17
+ }),
18
+ };
19
+ // eslint-disable-next-line no-restricted-syntax
20
+ static description = 'Delete a user';
21
+ // eslint-disable-next-line no-restricted-syntax
22
+ static examples = [
23
+ '<%= config.bin %> delete user john-doe',
24
+ '<%= config.bin %> delete user john-doe --force',
25
+ '<%= config.bin %> delete user john-doe --project centy-daemon',
26
+ ];
27
+ // eslint-disable-next-line no-restricted-syntax
28
+ static flags = {
29
+ force: Flags.boolean({
30
+ char: 'f',
31
+ description: 'Skip confirmation prompt',
32
+ default: false,
33
+ }),
34
+ project: projectFlag,
35
+ };
36
+ async run() {
37
+ const { args, flags } = await this.parse(DeleteUser);
38
+ const cwd = await resolveProjectPath(flags.project);
39
+ try {
40
+ await ensureInitialized(cwd);
41
+ }
42
+ catch (error) {
43
+ if (error instanceof NotInitializedError) {
44
+ this.error(error.message);
45
+ }
46
+ throw error instanceof Error ? error : new Error(String(error));
47
+ }
48
+ if (!flags.force) {
49
+ const readline = await import('node:readline');
50
+ const rl = readline.createInterface({
51
+ input: process.stdin,
52
+ output: process.stdout,
53
+ });
54
+ const answer = await new Promise(resolve => {
55
+ rl.question(`Are you sure you want to delete user "${args.id}"? (y/N) `, resolve);
56
+ });
57
+ rl.close();
58
+ if (answer.toLowerCase() !== 'y') {
59
+ this.log('Cancelled.');
60
+ return;
61
+ }
62
+ }
63
+ const response = await daemonDeleteUser({
64
+ projectPath: cwd,
65
+ userId: args.id,
66
+ });
67
+ if (!response.success) {
68
+ this.error(response.error);
69
+ }
70
+ this.log(`Deleted user "${args.id}"`);
71
+ }
72
+ }
73
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/commands/delete/user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * Get an issue's plan
4
+ */
5
+ export default class GetPlan extends Command {
6
+ static aliases: string[];
7
+ static args: {
8
+ issueId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
9
+ };
10
+ static description: string;
11
+ static examples: string[];
12
+ static flags: {
13
+ output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ };
16
+ run(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/commands/get/plan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAUlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAE1C,OAAgB,OAAO,WAAgB;IAGvC,OAAgB,IAAI;;MAKnB;IAGD,OAAgB,WAAW,SAAwB;IAGnD,OAAgB,QAAQ,WAKvB;IAGD,OAAgB,KAAK;;;MAMpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8BlC"}
@@ -0,0 +1,68 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ // eslint-disable-next-line import/order
3
+ import { Args, Command, Flags } from '@oclif/core';
4
+ import { daemonGetPlan } from '../../daemon/daemon-get-plan.js';
5
+ import { projectFlag } from '../../flags/project-flag.js';
6
+ import { ensureInitialized, NotInitializedError, } from '../../utils/ensure-initialized.js';
7
+ import { resolveProjectPath } from '../../utils/resolve-project-path.js';
8
+ /**
9
+ * Get an issue's plan
10
+ */
11
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
12
+ export default class GetPlan extends Command {
13
+ // eslint-disable-next-line no-restricted-syntax
14
+ static aliases = ['show:plan'];
15
+ // eslint-disable-next-line no-restricted-syntax
16
+ static args = {
17
+ issueId: Args.string({
18
+ description: 'Issue ID or display number',
19
+ required: true,
20
+ }),
21
+ };
22
+ // eslint-disable-next-line no-restricted-syntax
23
+ static description = "Get an issue's plan";
24
+ // eslint-disable-next-line no-restricted-syntax
25
+ static examples = [
26
+ '<%= config.bin %> get plan 1',
27
+ '<%= config.bin %> get plan abc123',
28
+ '<%= config.bin %> get plan 1 --output ./plan.md',
29
+ '<%= config.bin %> get plan 1 --project centy-daemon',
30
+ ];
31
+ // eslint-disable-next-line no-restricted-syntax
32
+ static flags = {
33
+ output: Flags.string({
34
+ char: 'o',
35
+ description: 'Output file path (prints to stdout by default)',
36
+ }),
37
+ project: projectFlag,
38
+ };
39
+ async run() {
40
+ const { args, flags } = await this.parse(GetPlan);
41
+ const cwd = await resolveProjectPath(flags.project);
42
+ try {
43
+ await ensureInitialized(cwd);
44
+ }
45
+ catch (error) {
46
+ if (error instanceof NotInitializedError) {
47
+ this.error(error.message);
48
+ }
49
+ throw error instanceof Error ? error : new Error(String(error));
50
+ }
51
+ const response = await daemonGetPlan({
52
+ projectPath: cwd,
53
+ issueId: args.issueId,
54
+ });
55
+ if (!response.exists) {
56
+ this.error(`No plan found for issue ${args.issueId}`);
57
+ }
58
+ if (flags.output) {
59
+ // eslint-disable-next-line security/detect-non-literal-fs-filename
60
+ await writeFile(flags.output, response.content);
61
+ this.log(`Saved plan to ${flags.output}`);
62
+ }
63
+ else {
64
+ this.log(response.content);
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/commands/get/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,wCAAwC;AACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AAExE;;GAEG;AACH,qFAAqF;AACrF,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,gDAAgD;IAChD,MAAM,CAAU,OAAO,GAAG,CAAC,WAAW,CAAC,CAAA;IAEvC,gDAAgD;IAChD,MAAM,CAAU,IAAI,GAAG;QACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,4BAA4B;YACzC,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAA;IAED,gDAAgD;IAChD,MAAM,CAAU,WAAW,GAAG,qBAAqB,CAAA;IAEnD,gDAAgD;IAChD,MAAM,CAAU,QAAQ,GAAG;QACzB,8BAA8B;QAC9B,mCAAmC;QACnC,iDAAiD;QACjD,qDAAqD;KACtD,CAAA;IAED,gDAAgD;IAChD,MAAM,CAAU,KAAK,GAAG;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,gDAAgD;SAC9D,CAAC;QACF,OAAO,EAAE,WAAW;KACrB,CAAA;IAEM,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACjD,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAEnD,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;gBACzC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC3B,CAAC;YACD,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACjE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC;YACnC,WAAW,EAAE,GAAG;YAChB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;QACvD,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,mEAAmE;YACnE,MAAM,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;YAC/C,IAAI,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC"}