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,17 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * Get a user by ID
4
+ */
5
+ export default class GetUser 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
+ json: 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/get/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAUlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAE1C,OAAgB,IAAI;;MAKnB;IAGD,OAAgB,WAAW,SAAqB;IAGhD,OAAgB,QAAQ,WAIvB;IAGD,OAAgB,KAAK;;;MAMpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAyClC"}
@@ -0,0 +1,75 @@
1
+ // eslint-disable-next-line import/order
2
+ import { Args, Command, Flags } from '@oclif/core';
3
+ import { daemonGetUser } from '../../daemon/daemon-get-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
+ * Get a user by ID
9
+ */
10
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
11
+ export default class GetUser 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 = 'Get a user by ID';
21
+ // eslint-disable-next-line no-restricted-syntax
22
+ static examples = [
23
+ '<%= config.bin %> get user john-doe',
24
+ '<%= config.bin %> get user john-doe --json',
25
+ '<%= config.bin %> get user john-doe --project centy-daemon',
26
+ ];
27
+ // eslint-disable-next-line no-restricted-syntax
28
+ static flags = {
29
+ json: Flags.boolean({
30
+ description: 'Output as JSON',
31
+ default: false,
32
+ }),
33
+ project: projectFlag,
34
+ };
35
+ async run() {
36
+ const { args, flags } = await this.parse(GetUser);
37
+ const cwd = await resolveProjectPath(flags.project);
38
+ try {
39
+ await ensureInitialized(cwd);
40
+ }
41
+ catch (error) {
42
+ if (error instanceof NotInitializedError) {
43
+ this.error(error.message);
44
+ }
45
+ throw error instanceof Error ? error : new Error(String(error));
46
+ }
47
+ try {
48
+ const user = await daemonGetUser({
49
+ projectPath: cwd,
50
+ userId: args.id,
51
+ });
52
+ if (flags.json) {
53
+ this.log(JSON.stringify(user, null, 2));
54
+ return;
55
+ }
56
+ this.log(`User: ${user.id}`);
57
+ this.log(` Name: ${user.name}`);
58
+ if (user.email !== undefined && user.email !== '') {
59
+ this.log(` Email: ${user.email}`);
60
+ }
61
+ if (user.gitUsernames !== undefined && user.gitUsernames.length > 0) {
62
+ this.log(` Git usernames: ${user.gitUsernames.join(', ')}`);
63
+ }
64
+ this.log(` Created: ${user.createdAt}`);
65
+ this.log(` Updated: ${user.updatedAt}`);
66
+ }
67
+ catch (error) {
68
+ if (error instanceof Error && error.message.includes('not found')) {
69
+ this.error(`User "${args.id}" not found`);
70
+ }
71
+ throw error instanceof Error ? error : new Error(String(error));
72
+ }
73
+ }
74
+ }
75
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/commands/get/user.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,13 @@ export default class Init extends Command {
7
7
  static examples: string[];
8
8
  static flags: {
9
9
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ 'priority-levels': import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ 'default-state': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ 'allowed-states': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ version: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ 'llm-auto-close': import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ 'llm-update-status': import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ 'llm-allow-direct-edits': import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
17
  };
11
18
  run(): Promise<void>;
12
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAI5C;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IAEvC,OAAgB,WAAW,SAC0B;IAGrD,OAAgB,QAAQ,WAGvB;IAGD,OAAgB,KAAK;;MAMpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAalC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAI5C;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IAEvC,OAAgB,WAAW,SAC0B;IAGrD,OAAgB,QAAQ,WAGvB;IAGD,OAAgB,KAAK;;;;;;;;;MAkCpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA4BlC"}
@@ -20,13 +20,55 @@ export default class Init extends Command {
20
20
  description: 'Skip interactive prompts and use defaults',
21
21
  default: false,
22
22
  }),
23
+ // Config flags
24
+ 'priority-levels': Flags.integer({
25
+ description: 'Number of priority levels (1-10, default: 3)',
26
+ min: 1,
27
+ max: 10,
28
+ }),
29
+ 'default-state': Flags.string({
30
+ description: 'Default state for new issues (default: "open")',
31
+ }),
32
+ 'allowed-states': Flags.string({
33
+ description: 'Comma-separated list of allowed states',
34
+ }),
35
+ version: Flags.string({
36
+ description: 'Project version (semver)',
37
+ }),
38
+ // LLM flags
39
+ 'llm-auto-close': Flags.boolean({
40
+ description: 'Auto-close issues when LLM completes work',
41
+ allowNo: true,
42
+ }),
43
+ 'llm-update-status': Flags.boolean({
44
+ description: 'Update status to in-progress when LLM starts',
45
+ allowNo: true,
46
+ }),
47
+ 'llm-allow-direct-edits': Flags.boolean({
48
+ description: 'Allow LLM to directly edit issue files',
49
+ allowNo: true,
50
+ }),
23
51
  };
24
52
  async run() {
25
53
  const { flags } = await this.parse(Init);
26
54
  // Allow CENTY_CWD env var to override working directory (for testing)
27
55
  // eslint-disable-next-line no-restricted-syntax
28
56
  const cwd = process.env['CENTY_CWD'];
29
- const result = await init({ force: flags.force, cwd });
57
+ // Parse allowed-states if provided
58
+ const allowedStates = flags['allowed-states']
59
+ ? flags['allowed-states'].split(',').map(s => s.trim())
60
+ : undefined;
61
+ const result = await init({
62
+ force: flags.force,
63
+ cwd,
64
+ priorityLevels: flags['priority-levels'],
65
+ defaultState: flags['default-state'],
66
+ allowedStates,
67
+ version: flags.version,
68
+ llmAutoClose: flags['llm-auto-close'],
69
+ llmUpdateStatus: flags['llm-update-status'],
70
+ llmAllowDirectEdits: flags['llm-allow-direct-edits'],
71
+ });
30
72
  if (!result.success) {
31
73
  this.exit(1);
32
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAE3C;;GAEG;AACH,qFAAqF;AACrF,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,gDAAgD;IAChD,MAAM,CAAU,WAAW,GACzB,mDAAmD,CAAA;IAErD,gDAAgD;IAChD,MAAM,CAAU,QAAQ,GAAG;QACzB,qCAAqC;QACrC,6CAA6C;KAC9C,CAAA;IAED,gDAAgD;IAChD,MAAM,CAAU,KAAK,GAAG;QACtB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,2CAA2C;YACxD,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAA;IAEM,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAExC,sEAAsE;QACtE,gDAAgD;QAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAEpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QAEtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACd,CAAC;IACH,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAE3C;;GAEG;AACH,qFAAqF;AACrF,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,gDAAgD;IAChD,MAAM,CAAU,WAAW,GACzB,mDAAmD,CAAA;IAErD,gDAAgD;IAChD,MAAM,CAAU,QAAQ,GAAG;QACzB,qCAAqC;QACrC,6CAA6C;KAC9C,CAAA;IAED,gDAAgD;IAChD,MAAM,CAAU,KAAK,GAAG;QACtB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,2CAA2C;YACxD,OAAO,EAAE,KAAK;SACf,CAAC;QACF,eAAe;QACf,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC;YAC/B,WAAW,EAAE,8CAA8C;YAC3D,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,EAAE;SACR,CAAC;QACF,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC;YAC5B,WAAW,EAAE,gDAAgD;SAC9D,CAAC;QACF,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC;YAC7B,WAAW,EAAE,wCAAwC;SACtD,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,0BAA0B;SACxC,CAAC;QACF,YAAY;QACZ,gBAAgB,EAAE,KAAK,CAAC,OAAO,CAAC;YAC9B,WAAW,EAAE,2CAA2C;YACxD,OAAO,EAAE,IAAI;SACd,CAAC;QACF,mBAAmB,EAAE,KAAK,CAAC,OAAO,CAAC;YACjC,WAAW,EAAE,8CAA8C;YAC3D,OAAO,EAAE,IAAI;SACd,CAAC;QACF,wBAAwB,EAAE,KAAK,CAAC,OAAO,CAAC;YACtC,WAAW,EAAE,wCAAwC;YACrD,OAAO,EAAE,IAAI;SACd,CAAC;KACH,CAAA;IAEM,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAExC,sEAAsE;QACtE,gDAAgD;QAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAEpC,mCAAmC;QACnC,MAAM,aAAa,GAAG,KAAK,CAAC,gBAAgB,CAAC;YAC3C,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACvD,CAAC,CAAC,SAAS,CAAA;QAEb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG;YACH,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC;YACxC,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC;YACpC,aAAa;YACb,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC;YACrC,eAAe,EAAE,KAAK,CAAC,mBAAmB,CAAC;YAC3C,mBAAmB,EAAE,KAAK,CAAC,wBAAwB,CAAC;SACrD,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACd,CAAC;IACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * List all users in the project
4
+ */
5
+ export default class ListUsers extends Command {
6
+ static description: string;
7
+ static examples: string[];
8
+ static flags: {
9
+ 'git-username': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/commands/list/users.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAU5C;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAE5C,OAAgB,WAAW,SAAkC;IAG7D,OAAgB,QAAQ,WAKvB;IAGD,OAAgB,KAAK;;;;MAUpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAuClC"}
@@ -0,0 +1,67 @@
1
+ // eslint-disable-next-line import/order
2
+ import { Command, Flags } from '@oclif/core';
3
+ import { daemonListUsers } from '../../daemon/daemon-list-users.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
+ * List all users in the project
9
+ */
10
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
11
+ export default class ListUsers extends Command {
12
+ // eslint-disable-next-line no-restricted-syntax
13
+ static description = 'List all users in the project';
14
+ // eslint-disable-next-line no-restricted-syntax
15
+ static examples = [
16
+ '<%= config.bin %> list users',
17
+ '<%= config.bin %> list users --json',
18
+ '<%= config.bin %> list users --git-username johndoe',
19
+ '<%= config.bin %> list users --project centy-daemon',
20
+ ];
21
+ // eslint-disable-next-line no-restricted-syntax
22
+ static flags = {
23
+ 'git-username': Flags.string({
24
+ char: 'g',
25
+ description: 'Filter by git username',
26
+ }),
27
+ json: Flags.boolean({
28
+ description: 'Output as JSON',
29
+ default: false,
30
+ }),
31
+ project: projectFlag,
32
+ };
33
+ async run() {
34
+ const { flags } = await this.parse(ListUsers);
35
+ const cwd = await resolveProjectPath(flags.project);
36
+ try {
37
+ await ensureInitialized(cwd);
38
+ }
39
+ catch (error) {
40
+ if (error instanceof NotInitializedError) {
41
+ this.error(error.message);
42
+ }
43
+ throw error instanceof Error ? error : new Error(String(error));
44
+ }
45
+ const response = await daemonListUsers({
46
+ projectPath: cwd,
47
+ gitUsername: flags['git-username'],
48
+ });
49
+ if (flags.json) {
50
+ this.log(JSON.stringify(response.users, null, 2));
51
+ return;
52
+ }
53
+ if (response.users.length === 0) {
54
+ this.log('No users found.');
55
+ return;
56
+ }
57
+ this.log(`Found ${response.totalCount} user(s):\n`);
58
+ for (const user of response.users) {
59
+ const gitNames = user.gitUsernames.length > 0
60
+ ? ` (git: ${user.gitUsernames.join(', ')})`
61
+ : '';
62
+ const email = user.email !== undefined && user.email !== '' ? ` <${user.email}>` : '';
63
+ this.log(` ${user.id}: ${user.name}${email}${gitNames}`);
64
+ }
65
+ }
66
+ }
67
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/commands/list/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * Set a custom title for a project
4
+ */
5
+ export default class ProjectTitle extends Command {
6
+ static args: {
7
+ title: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
+ };
9
+ static description: string;
10
+ static examples: string[];
11
+ static flags: {
12
+ path: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ shared: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ clear: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ };
17
+ run(): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=title.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title.d.ts","sourceRoot":"","sources":["../../../src/commands/project/title.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAKlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,OAAO;IAE/C,OAAgB,IAAI;;MAKnB;IAGD,OAAgB,WAAW,SAAqC;IAGhE,OAAgB,QAAQ,WAMvB;IAGD,OAAgB,KAAK;;;;;MAoBpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgClC"}
@@ -0,0 +1,76 @@
1
+ // eslint-disable-next-line import/order
2
+ import { Args, Command, Flags } from '@oclif/core';
3
+ import { daemonSetProjectTitle } from '../../daemon/daemon-set-project-title.js';
4
+ import { daemonSetProjectUserTitle } from '../../daemon/daemon-set-project-user-title.js';
5
+ /**
6
+ * Set a custom title for a project
7
+ */
8
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
9
+ export default class ProjectTitle extends Command {
10
+ // eslint-disable-next-line no-restricted-syntax
11
+ static args = {
12
+ title: Args.string({
13
+ description: 'Custom title for the project (omit to clear)',
14
+ required: false,
15
+ }),
16
+ };
17
+ // eslint-disable-next-line no-restricted-syntax
18
+ static description = 'Set a custom title for a project';
19
+ // eslint-disable-next-line no-restricted-syntax
20
+ static examples = [
21
+ '<%= config.bin %> project title "My Awesome Project"',
22
+ '<%= config.bin %> project title "Work Project" --shared',
23
+ '<%= config.bin %> project title --clear',
24
+ '<%= config.bin %> project title --clear --shared',
25
+ '<%= config.bin %> project title "Custom Name" --path /path/to/project',
26
+ ];
27
+ // eslint-disable-next-line no-restricted-syntax
28
+ static flags = {
29
+ path: Flags.string({
30
+ char: 'p',
31
+ description: 'Path to the project (defaults to current directory)',
32
+ }),
33
+ shared: Flags.boolean({
34
+ char: 's',
35
+ description: 'Set project-scope title (visible to all, stored in .centy/project.json)',
36
+ default: false,
37
+ }),
38
+ clear: Flags.boolean({
39
+ char: 'c',
40
+ description: 'Clear the custom title',
41
+ default: false,
42
+ }),
43
+ json: Flags.boolean({
44
+ description: 'Output as JSON',
45
+ default: false,
46
+ }),
47
+ };
48
+ async run() {
49
+ const { args, flags } = await this.parse(ProjectTitle);
50
+ // eslint-disable-next-line no-restricted-syntax
51
+ const projectPath = flags.path ?? process.env['CENTY_CWD'] ?? process.cwd();
52
+ // eslint-disable-next-line no-restricted-syntax
53
+ const title = flags.clear ? '' : (args.title ?? '');
54
+ if (!title && !flags.clear) {
55
+ this.error('Provide a title or use --clear to remove');
56
+ }
57
+ const response = flags.shared
58
+ ? await daemonSetProjectTitle({ projectPath, title })
59
+ : await daemonSetProjectUserTitle({ projectPath, title });
60
+ if (!response.success) {
61
+ this.error(response.error);
62
+ }
63
+ if (flags.json) {
64
+ this.log(JSON.stringify(response.project, null, 2));
65
+ return;
66
+ }
67
+ const scope = flags.shared ? 'project-scope' : 'user-scope';
68
+ if (flags.clear || !args.title) {
69
+ this.log(`Cleared ${scope} title for "${response.project.name}"`);
70
+ }
71
+ else {
72
+ this.log(`Set ${scope} title: "${args.title}"`);
73
+ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=title.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title.js","sourceRoot":"","sources":["../../../src/commands/project/title.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * Sync users from git history
4
+ */
5
+ export default class SyncUsers extends Command {
6
+ static description: string;
7
+ static examples: string[];
8
+ static flags: {
9
+ 'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ run(): Promise<void>;
14
+ private printDryRunOutput;
15
+ private printSyncOutput;
16
+ }
17
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/users.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAA;AAW5C;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,OAAO;IAE5C,OAAgB,WAAW,SAAgC;IAG3D,OAAgB,QAAQ,WAKvB;IAGD,OAAgB,KAAK;;;;MAWpB;IAEY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAkCjC,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,eAAe;CAmBxB"}
@@ -0,0 +1,105 @@
1
+ // eslint-disable-next-line import/order
2
+ import { Command, Flags } from '@oclif/core';
3
+ import { daemonSyncUsers } from '../../daemon/daemon-sync-users.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
+ * Sync users from git history
9
+ */
10
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
11
+ export default class SyncUsers extends Command {
12
+ // eslint-disable-next-line no-restricted-syntax
13
+ static description = 'Sync users from git history';
14
+ // eslint-disable-next-line no-restricted-syntax
15
+ static examples = [
16
+ '<%= config.bin %> sync users',
17
+ '<%= config.bin %> sync users --dry-run',
18
+ '<%= config.bin %> sync users --json',
19
+ '<%= config.bin %> sync users --project centy-daemon',
20
+ ];
21
+ // eslint-disable-next-line no-restricted-syntax
22
+ static flags = {
23
+ 'dry-run': Flags.boolean({
24
+ char: 'd',
25
+ description: 'Show what would be done without making changes',
26
+ default: false,
27
+ }),
28
+ json: Flags.boolean({
29
+ description: 'Output as JSON',
30
+ default: false,
31
+ }),
32
+ project: projectFlag,
33
+ };
34
+ async run() {
35
+ const { flags } = await this.parse(SyncUsers);
36
+ const cwd = await resolveProjectPath(flags.project);
37
+ try {
38
+ await ensureInitialized(cwd);
39
+ }
40
+ catch (error) {
41
+ if (error instanceof NotInitializedError) {
42
+ this.error(error.message);
43
+ }
44
+ throw error instanceof Error ? error : new Error(String(error));
45
+ }
46
+ const response = await daemonSyncUsers({
47
+ projectPath: cwd,
48
+ dryRun: flags['dry-run'],
49
+ });
50
+ if (!response.success) {
51
+ this.error(response.error);
52
+ }
53
+ if (flags.json) {
54
+ this.log(JSON.stringify(response, null, 2));
55
+ return;
56
+ }
57
+ if (flags['dry-run']) {
58
+ this.printDryRunOutput(response);
59
+ }
60
+ else {
61
+ this.printSyncOutput(response);
62
+ }
63
+ }
64
+ printDryRunOutput(response) {
65
+ if (response.wouldCreate.length === 0 && response.wouldSkip.length === 0) {
66
+ this.log('No git contributors found.');
67
+ return;
68
+ }
69
+ if (response.wouldCreate.length > 0) {
70
+ this.log(`Would create ${response.wouldCreate.length} user(s):`);
71
+ for (const contributor of response.wouldCreate) {
72
+ this.log(` ${contributor.name} <${contributor.email}>`);
73
+ }
74
+ }
75
+ if (response.wouldSkip.length > 0) {
76
+ this.log(`\nWould skip ${response.wouldSkip.length} user(s) (already exist):`);
77
+ for (const contributor of response.wouldSkip) {
78
+ this.log(` ${contributor.name} <${contributor.email}>`);
79
+ }
80
+ }
81
+ }
82
+ printSyncOutput(response) {
83
+ if (response.created.length > 0) {
84
+ this.log(`Created ${response.created.length} user(s):`);
85
+ for (const userId of response.created)
86
+ this.log(` ${userId}`);
87
+ }
88
+ if (response.skipped.length > 0) {
89
+ this.log(`\nSkipped ${response.skipped.length} user(s) (already exist):`);
90
+ for (const email of response.skipped)
91
+ this.log(` ${email}`);
92
+ }
93
+ if (response.errors.length > 0) {
94
+ this.log(`\nErrors (${response.errors.length}):`);
95
+ for (const err of response.errors)
96
+ this.log(` ${err}`);
97
+ }
98
+ const hasNoResults = response.created.length === 0 &&
99
+ response.skipped.length === 0 &&
100
+ response.errors.length === 0;
101
+ if (hasNoResults)
102
+ this.log('No git contributors found.');
103
+ }
104
+ }
105
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/commands/sync/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Command } from '@oclif/core';
2
+ /**
3
+ * Unassign users from an issue
4
+ */
5
+ export default class UnassignIssue 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/unassign/issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAUlD;;GAEG;AAEH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAEhD,OAAgB,IAAI;;;MASnB;IAGD,OAAgB,WAAW,SAAiC;IAG5D,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 { daemonUnassignIssue } from '../../daemon/daemon-unassign-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
+ * Unassign users from an issue
9
+ */
10
+ // eslint-disable-next-line custom/no-default-class-export, class-export/class-export
11
+ export default class UnassignIssue 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 unassign (space-separated)',
20
+ required: true,
21
+ }),
22
+ };
23
+ // eslint-disable-next-line no-restricted-syntax
24
+ static description = 'Unassign users from an issue';
25
+ // eslint-disable-next-line no-restricted-syntax
26
+ static examples = [
27
+ '<%= config.bin %> unassign issue 1 john-doe',
28
+ '<%= config.bin %> unassign issue abc123-uuid alice bob',
29
+ '<%= config.bin %> unassign 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(UnassignIssue);
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 daemonUnassignIssue({
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(`Unassigned ${userIds.join(', ')} from issue #${issue.displayNumber}`);
74
+ const remaining = issue.metadata.assignees;
75
+ this.log(`Remaining assignees: ${remaining.length > 0 ? remaining.join(', ') : 'none'}`);
76
+ }
77
+ }
78
+ }
79
+ //# sourceMappingURL=issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../../src/commands/unassign/issue.ts"],"names":[],"mappings":"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"}