turnkey-slash.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. const TURNKEY_SUBCOMMANDS = [
  2. 'start',
  3. 'onboard',
  4. 'clarify',
  5. 'design',
  6. 'spec',
  7. 'tdd',
  8. 'develop',
  9. 'test',
  10. 'review',
  11. 'ship',
  12. ];
  13. function buildUsageMarkdown() {
  14. return [
  15. '# Turnkey Slash',
  16. '',
  17. 'Usage:',
  18. '- `/turnkey start <ticket text>`',
  19. '- `/turnkey onboard`',
  20. '- `/turnkey clarify`',
  21. '- `/turnkey design`',
  22. '- `/turnkey spec`',
  23. '- `/turnkey tdd`',
  24. '- `/turnkey develop`',
  25. '- `/turnkey test`',
  26. '- `/turnkey review`',
  27. '- `/turnkey ship`',
  28. '- `/turnkey help`',
  29. ].join('\n');
  30. }
  31. function buildHelpResponse(content) {
  32. return {
  33. type: 'builtin',
  34. action: 'help',
  35. data: {
  36. content,
  37. format: 'markdown',
  38. },
  39. };
  40. }
  41. export function parseTurnkeySlashArgs(args = []) {
  42. const [subcommandRaw, ...rest] = Array.isArray(args) ? args : [];
  43. const subcommand = String(subcommandRaw || '').trim().toLowerCase();
  44. if (!subcommand || subcommand === 'help') {
  45. return { action: 'help' };
  46. }
  47. if (!TURNKEY_SUBCOMMANDS.includes(subcommand)) {
  48. return {
  49. action: 'help',
  50. error: `Unknown /turnkey action: \`${subcommand}\``,
  51. };
  52. }
  53. return {
  54. action: 'forward',
  55. subcommand,
  56. args: rest,
  57. };
  58. }
  59. export async function executeTurnkeySlashCommand(args = []) {
  60. const parsed = parseTurnkeySlashArgs(args);
  61. if (parsed.action === 'help') {
  62. const content = parsed.error
  63. ? `${parsed.error}\n\n${buildUsageMarkdown()}`
  64. : buildUsageMarkdown();
  65. return buildHelpResponse(content);
  66. }
  67. const forwarded = [`/turnkey:${parsed.subcommand}`, ...parsed.args]
  68. .join(' ')
  69. .trim();
  70. return {
  71. type: 'custom',
  72. content: forwarded,
  73. hasFileIncludes: false,
  74. hasBashCommands: false,
  75. };
  76. }
  77. export { buildUsageMarkdown as getTurnkeySlashUsage };