popeye-cli 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/.env.example +4 -1
  2. package/CONTRIBUTING.md +10 -0
  3. package/README.md +111 -2
  4. package/dist/adapters/claude.d.ts +3 -2
  5. package/dist/adapters/claude.d.ts.map +1 -1
  6. package/dist/adapters/claude.js +214 -0
  7. package/dist/adapters/claude.js.map +1 -1
  8. package/dist/adapters/grok.d.ts +2 -1
  9. package/dist/adapters/grok.d.ts.map +1 -1
  10. package/dist/adapters/grok.js.map +1 -1
  11. package/dist/adapters/index.d.ts +8 -0
  12. package/dist/adapters/index.d.ts.map +1 -0
  13. package/dist/adapters/index.js +12 -0
  14. package/dist/adapters/index.js.map +1 -0
  15. package/dist/adapters/openai.d.ts +2 -2
  16. package/dist/adapters/openai.d.ts.map +1 -1
  17. package/dist/adapters/openai.js.map +1 -1
  18. package/dist/cli/commands/create.d.ts.map +1 -1
  19. package/dist/cli/commands/create.js +25 -5
  20. package/dist/cli/commands/create.js.map +1 -1
  21. package/dist/cli/interactive.d.ts.map +1 -1
  22. package/dist/cli/interactive.js +47 -6
  23. package/dist/cli/interactive.js.map +1 -1
  24. package/dist/generators/all.d.ts +40 -0
  25. package/dist/generators/all.d.ts.map +1 -0
  26. package/dist/generators/all.js +826 -0
  27. package/dist/generators/all.js.map +1 -0
  28. package/dist/generators/fullstack.d.ts +9 -0
  29. package/dist/generators/fullstack.d.ts.map +1 -1
  30. package/dist/generators/fullstack.js.map +1 -1
  31. package/dist/generators/index.d.ts +3 -1
  32. package/dist/generators/index.d.ts.map +1 -1
  33. package/dist/generators/index.js +33 -0
  34. package/dist/generators/index.js.map +1 -1
  35. package/dist/generators/templates/index.d.ts +2 -0
  36. package/dist/generators/templates/index.d.ts.map +1 -1
  37. package/dist/generators/templates/index.js +2 -0
  38. package/dist/generators/templates/index.js.map +1 -1
  39. package/dist/generators/templates/website.d.ts +85 -0
  40. package/dist/generators/templates/website.d.ts.map +1 -0
  41. package/dist/generators/templates/website.js +877 -0
  42. package/dist/generators/templates/website.js.map +1 -0
  43. package/dist/generators/website.d.ts +56 -0
  44. package/dist/generators/website.d.ts.map +1 -0
  45. package/dist/generators/website.js +269 -0
  46. package/dist/generators/website.js.map +1 -0
  47. package/dist/types/consensus.d.ts +8 -3
  48. package/dist/types/consensus.d.ts.map +1 -1
  49. package/dist/types/index.d.ts +2 -2
  50. package/dist/types/index.d.ts.map +1 -1
  51. package/dist/types/index.js +2 -2
  52. package/dist/types/index.js.map +1 -1
  53. package/dist/types/project.d.ts +115 -1
  54. package/dist/types/project.d.ts.map +1 -1
  55. package/dist/types/project.js +41 -1
  56. package/dist/types/project.js.map +1 -1
  57. package/dist/workflow/consensus.d.ts +2 -1
  58. package/dist/workflow/consensus.d.ts.map +1 -1
  59. package/dist/workflow/consensus.js.map +1 -1
  60. package/dist/workflow/index.d.ts +6 -0
  61. package/dist/workflow/index.d.ts.map +1 -1
  62. package/dist/workflow/index.js +8 -0
  63. package/dist/workflow/index.js.map +1 -1
  64. package/dist/workflow/plan-mode.d.ts +3 -3
  65. package/dist/workflow/plan-mode.d.ts.map +1 -1
  66. package/dist/workflow/plan-mode.js.map +1 -1
  67. package/dist/workflow/plan-parser.d.ts +97 -0
  68. package/dist/workflow/plan-parser.d.ts.map +1 -0
  69. package/dist/workflow/plan-parser.js +235 -0
  70. package/dist/workflow/plan-parser.js.map +1 -0
  71. package/dist/workflow/plan-storage.d.ts +40 -12
  72. package/dist/workflow/plan-storage.d.ts.map +1 -1
  73. package/dist/workflow/plan-storage.js +47 -20
  74. package/dist/workflow/plan-storage.js.map +1 -1
  75. package/dist/workflow/seo-tests.d.ts +43 -0
  76. package/dist/workflow/seo-tests.d.ts.map +1 -0
  77. package/dist/workflow/seo-tests.js +192 -0
  78. package/dist/workflow/seo-tests.js.map +1 -0
  79. package/dist/workflow/separation-guard.d.ts +35 -0
  80. package/dist/workflow/separation-guard.d.ts.map +1 -0
  81. package/dist/workflow/separation-guard.js +154 -0
  82. package/dist/workflow/separation-guard.js.map +1 -0
  83. package/dist/workflow/test-runner.d.ts.map +1 -1
  84. package/dist/workflow/test-runner.js +128 -0
  85. package/dist/workflow/test-runner.js.map +1 -1
  86. package/dist/workflow/workspace-manager.d.ts +31 -20
  87. package/dist/workflow/workspace-manager.d.ts.map +1 -1
  88. package/dist/workflow/workspace-manager.js +38 -9
  89. package/dist/workflow/workspace-manager.js.map +1 -1
  90. package/package.json +1 -1
  91. package/src/adapters/claude.ts +221 -4
  92. package/src/adapters/grok.ts +2 -1
  93. package/src/adapters/index.ts +15 -0
  94. package/src/adapters/openai.ts +2 -2
  95. package/src/cli/commands/create.ts +25 -5
  96. package/src/cli/interactive.ts +47 -6
  97. package/src/generators/all.ts +897 -0
  98. package/src/generators/fullstack.ts +10 -0
  99. package/src/generators/index.ts +54 -0
  100. package/src/generators/templates/index.ts +2 -0
  101. package/src/generators/templates/website.ts +906 -0
  102. package/src/generators/website.ts +350 -0
  103. package/src/types/consensus.ts +9 -3
  104. package/src/types/index.ts +33 -0
  105. package/src/types/project.ts +139 -2
  106. package/src/workflow/consensus.ts +3 -2
  107. package/src/workflow/index.ts +8 -0
  108. package/src/workflow/plan-mode.ts +3 -3
  109. package/src/workflow/plan-parser.ts +317 -0
  110. package/src/workflow/plan-storage.ts +69 -30
  111. package/src/workflow/seo-tests.ts +246 -0
  112. package/src/workflow/separation-guard.ts +200 -0
  113. package/src/workflow/test-runner.ts +149 -0
  114. package/src/workflow/workspace-manager.ts +68 -31
@@ -302,7 +302,12 @@ function drawInputBoxTop(state: SessionState): void {
302
302
 
303
303
  // Hints line (above the box)
304
304
  const hints = [
305
- theme.dim('/lang ') + theme.primary('py') + theme.dim('|') + theme.primary('ts') + theme.dim('|') + theme.primary('fs'),
305
+ theme.dim('/lang ') +
306
+ theme.primary('be') + theme.dim('|') +
307
+ theme.primary('fe') + theme.dim('|') +
308
+ theme.primary('fs') + theme.dim('|') +
309
+ theme.primary('web') + theme.dim('|') +
310
+ theme.primary('all'),
306
311
  theme.dim('/config'),
307
312
  theme.dim('/help'),
308
313
  theme.dim('/exit'),
@@ -310,7 +315,14 @@ function drawInputBoxTop(state: SessionState): void {
310
315
  console.log(' ' + hints.join(' '));
311
316
 
312
317
  // Status items for the top line
313
- const langStatus = state.language === 'fullstack' ? 'fs' : state.language;
318
+ const langShortcuts: Record<OutputLanguage, string> = {
319
+ python: 'be',
320
+ typescript: 'fe',
321
+ fullstack: 'fs',
322
+ website: 'web',
323
+ all: 'all',
324
+ };
325
+ const langStatus = langShortcuts[state.language] || state.language;
314
326
  const reviewerStatus = state.reviewer === 'openai' ? 'O' : state.reviewer === 'grok' ? 'X' : 'G';
315
327
  const arbitratorStatus = state.enableArbitration
316
328
  ? (state.arbitrator === 'openai' ? 'O' : state.arbitrator === 'grok' ? 'X' : 'G')
@@ -1046,12 +1058,24 @@ async function handleConfig(state: SessionState, args: string[] = []): Promise<v
1046
1058
  if (args.length > 1) {
1047
1059
  // Map shortcuts to full language names
1048
1060
  const langAliases: Record<string, OutputLanguage> = {
1061
+ // Backend aliases
1049
1062
  'py': 'python',
1050
1063
  'python': 'python',
1064
+ 'be': 'python',
1065
+ 'backend': 'python',
1066
+ // Frontend aliases
1051
1067
  'ts': 'typescript',
1052
1068
  'typescript': 'typescript',
1069
+ 'fe': 'typescript',
1070
+ 'frontend': 'typescript',
1071
+ // Fullstack aliases
1053
1072
  'fs': 'fullstack',
1054
1073
  'fullstack': 'fullstack',
1074
+ // Website aliases
1075
+ 'web': 'website',
1076
+ 'website': 'website',
1077
+ // All aliases
1078
+ 'all': 'all',
1055
1079
  };
1056
1080
  const input = args[1].toLowerCase();
1057
1081
  const lang = langAliases[input];
@@ -1059,7 +1083,7 @@ async function handleConfig(state: SessionState, args: string[] = []): Promise<v
1059
1083
  state.language = lang;
1060
1084
  printSuccess(`Language set to ${lang}`);
1061
1085
  } else {
1062
- printError('Invalid language. Use: py, ts, fs (or python, typescript, fullstack)');
1086
+ printError('Invalid language. Use: be, fe, fs, web, all (or python, typescript, fullstack, website, all)');
1063
1087
  }
1064
1088
  } else {
1065
1089
  printKeyValue('Language', state.language);
@@ -1098,7 +1122,7 @@ async function handleConfig(state: SessionState, args: string[] = []): Promise<v
1098
1122
  console.log(theme.secondary(' Change settings:'));
1099
1123
  console.log(theme.dim(' /config reviewer <openai|gemini|grok>'));
1100
1124
  console.log(theme.dim(' /config arbitrator <openai|gemini|grok|off>'));
1101
- console.log(theme.dim(' /config language <python|typescript|fullstack>'));
1125
+ console.log(theme.dim(' /config language <be|fe|fs|web|all>'));
1102
1126
  console.log();
1103
1127
  }
1104
1128
 
@@ -1109,25 +1133,42 @@ function handleLanguage(args: string[], state: SessionState): void {
1109
1133
  if (args.length === 0) {
1110
1134
  console.log();
1111
1135
  printKeyValue('Current language', state.language);
1112
- printInfo('Use /language <py|ts|fs> or <python|typescript|fullstack> to change');
1136
+ printInfo('Use /language <be|fe|fs|web|all> to change');
1137
+ console.log(theme.dim(' be/backend - Python (FastAPI)'));
1138
+ console.log(theme.dim(' fe/frontend - TypeScript (React/Vite)'));
1139
+ console.log(theme.dim(' fs/fullstack - FE + BE monorepo'));
1140
+ console.log(theme.dim(' web/website - Next.js marketing site'));
1141
+ console.log(theme.dim(' all - FE + BE + Website'));
1113
1142
  return;
1114
1143
  }
1115
1144
 
1116
1145
  // Map shortcuts to full language names
1117
1146
  const langAliases: Record<string, OutputLanguage> = {
1147
+ // Backend aliases
1118
1148
  'py': 'python',
1119
1149
  'python': 'python',
1150
+ 'be': 'python',
1151
+ 'backend': 'python',
1152
+ // Frontend aliases
1120
1153
  'ts': 'typescript',
1121
1154
  'typescript': 'typescript',
1155
+ 'fe': 'typescript',
1156
+ 'frontend': 'typescript',
1157
+ // Fullstack aliases
1122
1158
  'fs': 'fullstack',
1123
1159
  'fullstack': 'fullstack',
1160
+ // Website aliases
1161
+ 'web': 'website',
1162
+ 'website': 'website',
1163
+ // All aliases
1164
+ 'all': 'all',
1124
1165
  };
1125
1166
 
1126
1167
  const input = args[0].toLowerCase();
1127
1168
  const lang = langAliases[input];
1128
1169
 
1129
1170
  if (!lang) {
1130
- printError('Invalid language. Use: py, ts, fs (or python, typescript, fullstack)');
1171
+ printError('Invalid language. Use: be, fe, fs, web, all');
1131
1172
  return;
1132
1173
  }
1133
1174