@clawplays/ospec-cli 0.1.1

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 (191) hide show
  1. package/.ospec/templates/hooks/post-merge +8 -0
  2. package/.ospec/templates/hooks/pre-commit +8 -0
  3. package/LICENSE +21 -0
  4. package/README.md +549 -0
  5. package/README.zh-CN.md +549 -0
  6. package/assets/for-ai/en-US/ai-guide.md +98 -0
  7. package/assets/for-ai/en-US/execution-protocol.md +64 -0
  8. package/assets/for-ai/zh-CN/ai-guide.md +102 -0
  9. package/assets/for-ai/zh-CN/execution-protocol.md +68 -0
  10. package/assets/git-hooks/post-merge +12 -0
  11. package/assets/git-hooks/pre-commit +12 -0
  12. package/assets/global-skills/claude/ospec-change/SKILL.md +116 -0
  13. package/assets/global-skills/codex/ospec-change/SKILL.md +117 -0
  14. package/assets/global-skills/codex/ospec-change/agents/openai.yaml +7 -0
  15. package/assets/global-skills/codex/ospec-change/skill.yaml +19 -0
  16. package/assets/project-conventions/en-US/development-guide.md +32 -0
  17. package/assets/project-conventions/en-US/naming-conventions.md +51 -0
  18. package/assets/project-conventions/en-US/skill-conventions.md +40 -0
  19. package/assets/project-conventions/en-US/workflow-conventions.md +70 -0
  20. package/assets/project-conventions/zh-CN/development-guide.md +32 -0
  21. package/assets/project-conventions/zh-CN/naming-conventions.md +51 -0
  22. package/assets/project-conventions/zh-CN/skill-conventions.md +40 -0
  23. package/assets/project-conventions/zh-CN/workflow-conventions.md +74 -0
  24. package/dist/adapters/codex-stitch-adapter.js +420 -0
  25. package/dist/adapters/gemini-stitch-adapter.js +408 -0
  26. package/dist/adapters/playwright-checkpoint-adapter.js +2260 -0
  27. package/dist/advanced/BatchOperations.d.ts +36 -0
  28. package/dist/advanced/BatchOperations.js +159 -0
  29. package/dist/advanced/CachingLayer.d.ts +66 -0
  30. package/dist/advanced/CachingLayer.js +136 -0
  31. package/dist/advanced/FeatureUpdater.d.ts +46 -0
  32. package/dist/advanced/FeatureUpdater.js +151 -0
  33. package/dist/advanced/PerformanceMonitor.d.ts +52 -0
  34. package/dist/advanced/PerformanceMonitor.js +129 -0
  35. package/dist/advanced/StatePersistence.d.ts +61 -0
  36. package/dist/advanced/StatePersistence.js +168 -0
  37. package/dist/advanced/index.d.ts +14 -0
  38. package/dist/advanced/index.js +22 -0
  39. package/dist/cli/commands/config.d.ts +5 -0
  40. package/dist/cli/commands/config.js +6 -0
  41. package/dist/cli/commands/feature.d.ts +5 -0
  42. package/dist/cli/commands/feature.js +6 -0
  43. package/dist/cli/commands/index.d.ts +5 -0
  44. package/dist/cli/commands/index.js +6 -0
  45. package/dist/cli/commands/project.d.ts +5 -0
  46. package/dist/cli/commands/project.js +6 -0
  47. package/dist/cli/commands/validate.d.ts +5 -0
  48. package/dist/cli/commands/validate.js +6 -0
  49. package/dist/cli/index.d.ts +5 -0
  50. package/dist/cli/index.js +6 -0
  51. package/dist/cli.d.ts +3 -0
  52. package/dist/cli.js +1007 -0
  53. package/dist/commands/ArchiveCommand.d.ts +14 -0
  54. package/dist/commands/ArchiveCommand.js +241 -0
  55. package/dist/commands/BaseCommand.d.ts +33 -0
  56. package/dist/commands/BaseCommand.js +46 -0
  57. package/dist/commands/BatchCommand.d.ts +5 -0
  58. package/dist/commands/BatchCommand.js +42 -0
  59. package/dist/commands/ChangesCommand.d.ts +3 -0
  60. package/dist/commands/ChangesCommand.js +71 -0
  61. package/dist/commands/DocsCommand.d.ts +5 -0
  62. package/dist/commands/DocsCommand.js +118 -0
  63. package/dist/commands/FinalizeCommand.d.ts +3 -0
  64. package/dist/commands/FinalizeCommand.js +24 -0
  65. package/dist/commands/IndexCommand.d.ts +5 -0
  66. package/dist/commands/IndexCommand.js +57 -0
  67. package/dist/commands/InitCommand.d.ts +5 -0
  68. package/dist/commands/InitCommand.js +65 -0
  69. package/dist/commands/NewCommand.d.ts +11 -0
  70. package/dist/commands/NewCommand.js +262 -0
  71. package/dist/commands/PluginsCommand.d.ts +58 -0
  72. package/dist/commands/PluginsCommand.js +2491 -0
  73. package/dist/commands/ProgressCommand.d.ts +5 -0
  74. package/dist/commands/ProgressCommand.js +103 -0
  75. package/dist/commands/QueueCommand.d.ts +10 -0
  76. package/dist/commands/QueueCommand.js +147 -0
  77. package/dist/commands/RunCommand.d.ts +13 -0
  78. package/dist/commands/RunCommand.js +200 -0
  79. package/dist/commands/SkillCommand.d.ts +31 -0
  80. package/dist/commands/SkillCommand.js +1216 -0
  81. package/dist/commands/SkillsCommand.d.ts +5 -0
  82. package/dist/commands/SkillsCommand.js +68 -0
  83. package/dist/commands/StatusCommand.d.ts +6 -0
  84. package/dist/commands/StatusCommand.js +140 -0
  85. package/dist/commands/UpdateCommand.d.ts +8 -0
  86. package/dist/commands/UpdateCommand.js +251 -0
  87. package/dist/commands/VerifyCommand.d.ts +5 -0
  88. package/dist/commands/VerifyCommand.js +278 -0
  89. package/dist/commands/WorkflowCommand.d.ts +12 -0
  90. package/dist/commands/WorkflowCommand.js +150 -0
  91. package/dist/commands/index.d.ts +43 -0
  92. package/dist/commands/index.js +85 -0
  93. package/dist/core/constants.d.ts +41 -0
  94. package/dist/core/constants.js +73 -0
  95. package/dist/core/errors.d.ts +36 -0
  96. package/dist/core/errors.js +72 -0
  97. package/dist/core/index.d.ts +7 -0
  98. package/dist/core/index.js +23 -0
  99. package/dist/core/types.d.ts +369 -0
  100. package/dist/core/types.js +3 -0
  101. package/dist/index.d.ts +11 -0
  102. package/dist/index.js +27 -0
  103. package/dist/presets/ProjectPresets.d.ts +41 -0
  104. package/dist/presets/ProjectPresets.js +190 -0
  105. package/dist/scaffolds/ProjectScaffoldPresets.d.ts +20 -0
  106. package/dist/scaffolds/ProjectScaffoldPresets.js +151 -0
  107. package/dist/services/ConfigManager.d.ts +14 -0
  108. package/dist/services/ConfigManager.js +386 -0
  109. package/dist/services/FeatureManager.d.ts +5 -0
  110. package/dist/services/FeatureManager.js +6 -0
  111. package/dist/services/FileService.d.ts +21 -0
  112. package/dist/services/FileService.js +152 -0
  113. package/dist/services/IndexBuilder.d.ts +12 -0
  114. package/dist/services/IndexBuilder.js +130 -0
  115. package/dist/services/Logger.d.ts +20 -0
  116. package/dist/services/Logger.js +48 -0
  117. package/dist/services/ProjectAssetRegistry.d.ts +12 -0
  118. package/dist/services/ProjectAssetRegistry.js +96 -0
  119. package/dist/services/ProjectAssetService.d.ts +49 -0
  120. package/dist/services/ProjectAssetService.js +223 -0
  121. package/dist/services/ProjectScaffoldCommandService.d.ts +73 -0
  122. package/dist/services/ProjectScaffoldCommandService.js +159 -0
  123. package/dist/services/ProjectScaffoldService.d.ts +44 -0
  124. package/dist/services/ProjectScaffoldService.js +507 -0
  125. package/dist/services/ProjectService.d.ts +209 -0
  126. package/dist/services/ProjectService.js +13239 -0
  127. package/dist/services/QueueService.d.ts +17 -0
  128. package/dist/services/QueueService.js +142 -0
  129. package/dist/services/RunService.d.ts +40 -0
  130. package/dist/services/RunService.js +420 -0
  131. package/dist/services/SkillParser.d.ts +30 -0
  132. package/dist/services/SkillParser.js +88 -0
  133. package/dist/services/StateManager.d.ts +16 -0
  134. package/dist/services/StateManager.js +127 -0
  135. package/dist/services/TemplateEngine.d.ts +43 -0
  136. package/dist/services/TemplateEngine.js +119 -0
  137. package/dist/services/TemplateGenerator.d.ts +40 -0
  138. package/dist/services/TemplateGenerator.js +273 -0
  139. package/dist/services/ValidationService.d.ts +19 -0
  140. package/dist/services/ValidationService.js +44 -0
  141. package/dist/services/Validator.d.ts +5 -0
  142. package/dist/services/Validator.js +6 -0
  143. package/dist/services/index.d.ts +52 -0
  144. package/dist/services/index.js +91 -0
  145. package/dist/services/templates/ExecutionTemplateBuilder.d.ts +12 -0
  146. package/dist/services/templates/ExecutionTemplateBuilder.js +300 -0
  147. package/dist/services/templates/ProjectTemplateBuilder.d.ts +38 -0
  148. package/dist/services/templates/ProjectTemplateBuilder.js +1897 -0
  149. package/dist/services/templates/TemplateBuilderBase.d.ts +19 -0
  150. package/dist/services/templates/TemplateBuilderBase.js +60 -0
  151. package/dist/services/templates/TemplateInputFactory.d.ts +16 -0
  152. package/dist/services/templates/TemplateInputFactory.js +298 -0
  153. package/dist/services/templates/templateTypes.d.ts +90 -0
  154. package/dist/services/templates/templateTypes.js +3 -0
  155. package/dist/tools/build-index.js +632 -0
  156. package/dist/utils/DateUtils.d.ts +18 -0
  157. package/dist/utils/DateUtils.js +40 -0
  158. package/dist/utils/PathUtils.d.ts +9 -0
  159. package/dist/utils/PathUtils.js +66 -0
  160. package/dist/utils/StringUtils.d.ts +26 -0
  161. package/dist/utils/StringUtils.js +47 -0
  162. package/dist/utils/helpers.d.ts +5 -0
  163. package/dist/utils/helpers.js +6 -0
  164. package/dist/utils/index.d.ts +7 -0
  165. package/dist/utils/index.js +23 -0
  166. package/dist/utils/logger.d.ts +5 -0
  167. package/dist/utils/logger.js +6 -0
  168. package/dist/utils/path.d.ts +5 -0
  169. package/dist/utils/path.js +6 -0
  170. package/dist/utils/subcommandHelp.d.ts +11 -0
  171. package/dist/utils/subcommandHelp.js +119 -0
  172. package/dist/workflow/ArchiveGate.d.ts +30 -0
  173. package/dist/workflow/ArchiveGate.js +93 -0
  174. package/dist/workflow/ConfigurableWorkflow.d.ts +89 -0
  175. package/dist/workflow/ConfigurableWorkflow.js +186 -0
  176. package/dist/workflow/HookSystem.d.ts +38 -0
  177. package/dist/workflow/HookSystem.js +66 -0
  178. package/dist/workflow/IndexRegenerator.d.ts +49 -0
  179. package/dist/workflow/IndexRegenerator.js +147 -0
  180. package/dist/workflow/PluginWorkflowComposer.d.ts +138 -0
  181. package/dist/workflow/PluginWorkflowComposer.js +239 -0
  182. package/dist/workflow/SkillUpdateEngine.d.ts +26 -0
  183. package/dist/workflow/SkillUpdateEngine.js +113 -0
  184. package/dist/workflow/VerificationSystem.d.ts +24 -0
  185. package/dist/workflow/VerificationSystem.js +116 -0
  186. package/dist/workflow/WorkflowEngine.d.ts +15 -0
  187. package/dist/workflow/WorkflowEngine.js +57 -0
  188. package/dist/workflow/index.d.ts +19 -0
  189. package/dist/workflow/index.js +32 -0
  190. package/package.json +78 -0
  191. package/scripts/postinstall.js +43 -0
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createProjectScaffoldCommandService = exports.ProjectScaffoldCommandService = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const path_1 = __importDefault(require("path"));
9
+ class ProjectScaffoldCommandService {
10
+ constructor(fileService, logger) {
11
+ this.fileService = fileService;
12
+ this.logger = logger;
13
+ }
14
+ getPlan(normalized, scaffoldPlan) {
15
+ if (!scaffoldPlan) {
16
+ return null;
17
+ }
18
+ const installRunner = this.resolvePackageManagerRunner('npm');
19
+ return {
20
+ presetId: scaffoldPlan.presetId,
21
+ autoExecute: normalized.executeScaffoldCommands,
22
+ steps: [
23
+ {
24
+ id: 'install-dependencies',
25
+ title: normalized.documentLanguage === 'zh-CN'
26
+ ? '安装框架依赖'
27
+ : 'Install framework dependencies',
28
+ command: installRunner,
29
+ args: ['install'],
30
+ shellCommand: 'npm install',
31
+ description: normalized.documentLanguage === 'zh-CN'
32
+ ? '安装脚手架依赖,让生成的应用可以直接运行。'
33
+ : 'Install scaffold dependencies so the generated app can run immediately.',
34
+ phase: 'install',
35
+ },
36
+ ],
37
+ deferredMessage: normalized.documentLanguage === 'zh-CN'
38
+ ? '脚手架命令已生成但暂未执行。准备好后请在项目根目录运行 npm install。'
39
+ : 'Scaffold commands are prepared but deferred. Run npm install in the project root when you are ready.',
40
+ };
41
+ }
42
+ async executePlan(rootDir, plan) {
43
+ if (!plan || !plan.autoExecute || plan.steps.length === 0) {
44
+ return {
45
+ status: 'skipped',
46
+ steps: [],
47
+ recoveryFilePath: null,
48
+ };
49
+ }
50
+ const results = [];
51
+ for (const step of plan.steps) {
52
+ const stepResult = await this.executeStep(rootDir, step);
53
+ results.push(stepResult);
54
+ if (stepResult.status === 'failed') {
55
+ return {
56
+ status: 'failed',
57
+ steps: results,
58
+ recoveryFilePath: null,
59
+ };
60
+ }
61
+ }
62
+ return {
63
+ status: 'completed',
64
+ steps: results,
65
+ recoveryFilePath: null,
66
+ };
67
+ }
68
+ async writeRecoveryRecord(rootDir, input) {
69
+ const recoveryPath = path_1.default.join(rootDir, '.ospec', 'bootstrap-recovery.json');
70
+ const record = {
71
+ generatedAt: new Date().toISOString(),
72
+ projectPresetId: input.normalized.projectPresetId,
73
+ projectName: input.normalized.projectName,
74
+ failedStep: {
75
+ id: input.failedStep.id,
76
+ title: input.failedStep.title,
77
+ shellCommand: input.failedStep.shellCommand,
78
+ },
79
+ createdArtifacts: {
80
+ scaffoldFiles: input.scaffoldCreatedFiles,
81
+ scaffoldDirectories: input.scaffoldCreatedDirectories,
82
+ directCopyFiles: input.directCopyCreatedFiles,
83
+ hooks: input.hookInstalledFiles,
84
+ },
85
+ remediation: [
86
+ input.normalized.documentLanguage === 'zh-CN'
87
+ ? '先检查网络与 npm registry 可用性,再重新执行安装命令。'
88
+ : 'Check network access and npm registry availability, then rerun the install command.',
89
+ input.normalized.documentLanguage === 'zh-CN'
90
+ ? '重试前先查看已创建的脚手架文件,确认哪些内容已经生成。'
91
+ : 'Review the created scaffold files before retrying so you know which files were already generated.',
92
+ input.normalized.documentLanguage === 'zh-CN'
93
+ ? '修复环境后,可重新执行 bootstrap,或手动执行延后的安装命令。'
94
+ : 'After fixing the environment, rerun bootstrap or manually execute the deferred install command.',
95
+ ],
96
+ };
97
+ await this.fileService.writeJSON(recoveryPath, record);
98
+ return recoveryPath;
99
+ }
100
+ executeStep(rootDir, step) {
101
+ return new Promise(resolve => {
102
+ const startedAt = Date.now();
103
+ const child = (0, child_process_1.spawn)(step.command, step.args, {
104
+ cwd: rootDir,
105
+ shell: false,
106
+ });
107
+ let stdout = '';
108
+ let stderr = '';
109
+ child.stdout.on('data', chunk => {
110
+ stdout += String(chunk);
111
+ });
112
+ child.stderr.on('data', chunk => {
113
+ stderr += String(chunk);
114
+ });
115
+ child.on('error', error => {
116
+ this.logger.warn(`Scaffold command failed to start: ${step.shellCommand}`, error);
117
+ resolve({
118
+ id: step.id,
119
+ title: step.title,
120
+ shellCommand: step.shellCommand,
121
+ status: 'failed',
122
+ exitCode: null,
123
+ durationMs: Date.now() - startedAt,
124
+ stdoutSnippet: this.limitOutput(stdout),
125
+ stderrSnippet: this.limitOutput(`${stderr}\n${String(error)}`),
126
+ });
127
+ });
128
+ child.on('close', exitCode => {
129
+ resolve({
130
+ id: step.id,
131
+ title: step.title,
132
+ shellCommand: step.shellCommand,
133
+ status: exitCode === 0 ? 'completed' : 'failed',
134
+ exitCode,
135
+ durationMs: Date.now() - startedAt,
136
+ stdoutSnippet: this.limitOutput(stdout),
137
+ stderrSnippet: this.limitOutput(stderr),
138
+ });
139
+ });
140
+ });
141
+ }
142
+ resolvePackageManagerRunner(packageManager) {
143
+ if (process.platform === 'win32') {
144
+ return `${packageManager}.cmd`;
145
+ }
146
+ return packageManager;
147
+ }
148
+ limitOutput(value) {
149
+ const normalized = value.trim();
150
+ if (normalized.length <= 600) {
151
+ return normalized;
152
+ }
153
+ return `${normalized.slice(0, 600)}...`;
154
+ }
155
+ }
156
+ exports.ProjectScaffoldCommandService = ProjectScaffoldCommandService;
157
+ const createProjectScaffoldCommandService = (fileService, logger) => new ProjectScaffoldCommandService(fileService, logger);
158
+ exports.createProjectScaffoldCommandService = createProjectScaffoldCommandService;
159
+ //# sourceMappingURL=ProjectScaffoldCommandService.js.map
@@ -0,0 +1,44 @@
1
+ import { FileService } from './FileService';
2
+ import { NormalizedProjectBootstrapInput } from './TemplateEngine';
3
+ import { ProjectScaffoldFileDefinition } from '../scaffolds/ProjectScaffoldPresets';
4
+ export interface ProjectScaffoldPlan {
5
+ presetId: string;
6
+ title: string;
7
+ description: string;
8
+ framework: string;
9
+ installCommand: string;
10
+ directories: string[];
11
+ files: Array<ProjectScaffoldFileDefinition>;
12
+ newDirectories: string[];
13
+ existingDirectories: string[];
14
+ newFiles: string[];
15
+ existingFiles: string[];
16
+ }
17
+ export interface ProjectScaffoldApplyResult {
18
+ plan: ProjectScaffoldPlan | null;
19
+ createdDirectories: string[];
20
+ skippedDirectories: string[];
21
+ createdFiles: string[];
22
+ skippedFiles: string[];
23
+ }
24
+ export declare class ProjectScaffoldService {
25
+ private readonly fileService;
26
+ constructor(fileService: FileService);
27
+ getPlan(normalized: NormalizedProjectBootstrapInput): ProjectScaffoldPlan | null;
28
+ getPlanForProject(rootDir: string, normalized: NormalizedProjectBootstrapInput): Promise<ProjectScaffoldPlan | null>;
29
+ getGeneratedPaths(normalized: NormalizedProjectBootstrapInput): string[];
30
+ applyScaffold(rootDir: string, normalized: NormalizedProjectBootstrapInput): Promise<ProjectScaffoldApplyResult | null>;
31
+ private renderFileContent;
32
+ private renderPackageJson;
33
+ private renderHomePage;
34
+ private renderSectionPage;
35
+ private renderSiteShell;
36
+ private renderHomeHero;
37
+ private renderNavigationFile;
38
+ private toPackageName;
39
+ private isPlaceholder;
40
+ private escapeTemplateString;
41
+ private getCopy;
42
+ }
43
+ export declare const createProjectScaffoldService: (fileService: FileService) => ProjectScaffoldService;
44
+ //# sourceMappingURL=ProjectScaffoldService.d.ts.map