ai-developer-skill-os 7.5.1 → 8.1.4

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 (300) hide show
  1. package/.agents/docs/ARCHITECTURE.md +156 -0
  2. package/.agents/docs/MIGRATION-CLEANUP-V8.1.3.md +36 -0
  3. package/.agents/docs/MIGRATION-STATUS.md +35 -0
  4. package/.agents/docs/MIGRATION-V8.md +10 -0
  5. package/.agents/docs/ROADMAP-V8.2.md +78 -0
  6. package/.agents/docs/V8-CERTIFICATION.md +27 -0
  7. package/.agents/docs/VERSIONING.md +95 -0
  8. package/.agents/docs/decisions/ADR-001-v8-migration.md +58 -0
  9. package/.agents/docs/decisions/ADR-002-workflow-separation.md +50 -0
  10. package/.agents/docs/decisions/ADR-003-registry-generated.md +54 -0
  11. package/.agents/docs/decisions/ADR-008-skill-boundary-review.md +27 -0
  12. package/.agents/docs/schemas/learning.schema.yml +69 -0
  13. package/.agents/docs/schemas/skill.schema.yml +188 -0
  14. package/.agents/docs/schemas/workflow.schema.yml +33 -0
  15. package/.agents/knowledge/design-intelligence/industries/ecommerce.md +3 -0
  16. package/.agents/knowledge/design-intelligence/industries/fintech.md +3 -0
  17. package/.agents/knowledge/design-intelligence/industries/healthcare.md +3 -0
  18. package/.agents/learnings/draft/README.md +37 -0
  19. package/.agents/registry/capability-graph.yml +500 -0
  20. package/.agents/registry/skills-index.yml +525 -0
  21. package/.agents/reports/RELEASE-CHECKLIST.md +29 -0
  22. package/.agents/reports/architecture-audit.md +13 -0
  23. package/.agents/reports/graph-health.md +20 -0
  24. package/.agents/reports/skill-audit.md +215 -0
  25. package/.agents/rules/coding.md +102 -0
  26. package/.agents/rules/command-safety.md +21 -0
  27. package/.agents/rules/global.md +135 -0
  28. package/.agents/rules/priorities.yml +24 -0
  29. package/.agents/rules/safety.md +84 -0
  30. package/.agents/rules/security.md +13 -0
  31. package/.agents/rules/skill-quality.md +14 -0
  32. package/.agents/skills/_template/SKILL.md +132 -0
  33. package/.agents/skills/qk-access-policy/SKILL.md +61 -5
  34. package/.agents/skills/qk-agent-observability/SKILL.md +73 -0
  35. package/.agents/skills/qk-ai-builder/SKILL.md +62 -5
  36. package/.agents/skills/qk-api-lifecycle/SKILL.md +59 -6
  37. package/.agents/skills/qk-bug-resolution/SKILL.md +64 -6
  38. package/.agents/skills/qk-context-loader/SKILL.md +63 -11
  39. package/.agents/skills/qk-data-lifecycle/SKILL.md +61 -5
  40. package/.agents/skills/qk-db-optimizer/SKILL.md +61 -5
  41. package/.agents/skills/qk-design-system-engineering/SKILL.md +112 -0
  42. package/.agents/skills/qk-devops-platform/SKILL.md +117 -0
  43. package/.agents/skills/qk-docs/SKILL.md +62 -6
  44. package/.agents/skills/qk-engineering-standard/SKILL.md +62 -12
  45. package/.agents/skills/qk-fe-api-integration/SKILL.md +60 -6
  46. package/.agents/skills/qk-feature-delivery/SKILL.md +65 -6
  47. package/.agents/skills/qk-frontend-architecture/SKILL.md +134 -0
  48. package/.agents/skills/qk-help/SKILL.md +245 -193
  49. package/.agents/skills/qk-orchestrator/SKILL.md +64 -11
  50. package/.agents/skills/qk-orchestrator/references/routing-table.md +1 -1
  51. package/.agents/skills/qk-product-specification/SKILL.md +130 -0
  52. package/.agents/skills/qk-production-release/SKILL.md +59 -6
  53. package/.agents/skills/qk-project-bootstrap/SKILL.md +66 -6
  54. package/.agents/skills/qk-project-health/SKILL.md +63 -6
  55. package/.agents/skills/qk-project-memory/SKILL.md +63 -6
  56. package/.agents/skills/qk-security-audit/SKILL.md +135 -0
  57. package/.agents/skills/qk-system-evolution/SKILL.md +63 -12
  58. package/.agents/skills/qk-test-engineering/SKILL.md +139 -0
  59. package/.agents/skills/qk-ui-audit/SKILL.md +60 -6
  60. package/.agents/skills/qk-ui-builder/SKILL.md +509 -446
  61. package/.agents/skills/qk-ui-system-builder/SKILL.md +61 -5
  62. package/.agents/skills/qk-validation-gate/SKILL.md +63 -11
  63. package/.agents/skills/qk-web-quality-gate/SKILL.md +114 -0
  64. package/.agents/workflows/_schema.yml +109 -0
  65. package/.agents/workflows/bug-resolution.yml +101 -0
  66. package/.agents/workflows/code-review.yml +77 -0
  67. package/.agents/workflows/documentation.yml +75 -0
  68. package/.agents/workflows/feature-delivery.yml +103 -0
  69. package/.agents/workflows/refactor.yml +81 -0
  70. package/.agents/workflows/research.yml +60 -0
  71. package/.agents/workflows/security-audit.yml +72 -0
  72. package/.agents/workflows/skill-evolution.yml +65 -0
  73. package/.agents/workflows/spec-driven-development.yml +57 -0
  74. package/CHANGELOG.md +91 -70
  75. package/README.md +44 -59
  76. package/bin/install.js +57 -309
  77. package/package.json +13 -2
  78. package/tooling/generate-evaluation-cases.cjs +44 -0
  79. package/tooling/generate-registry.js +157 -0
  80. package/tooling/run-aar.js +143 -0
  81. package/tooling/validate-graph.js +87 -0
  82. package/tooling/validate-skills.js +102 -0
  83. package/.agents/skills.json +0 -819
  84. package/.github/workflows/ci.yml +0 -56
  85. package/CLAUDE.md +0 -110
  86. package/_template/BEHAVIOR_SPEC.md +0 -96
  87. package/_template/examples/example-en.md +0 -49
  88. package/_template/examples/example-vi.md +0 -49
  89. package/add_lang.js +0 -21
  90. package/add_lang.py +0 -25
  91. package/add_sections.py +0 -53
  92. package/bin/lint.js +0 -123
  93. package/docs/CHI_TIET_SKILLS.md +0 -126
  94. package/docs/GOVERNANCE.md +0 -40
  95. package/docs/HUONG_DAN_SU_DUNG.md +0 -120
  96. package/docs/SPEC.md +0 -87
  97. package/docs/adr/0001-intent-based-architecture.md +0 -19
  98. package/docs/adr/0002-kernel-freeze.md +0 -21
  99. package/docs/adr/0003-risk-based-verification.md +0 -20
  100. package/docs/adr/0004-progressive-evidence.md +0 -19
  101. package/docs/skill-classification.md +0 -25
  102. package/fix_seeds.js +0 -22
  103. package/framework/KERNEL.md +0 -83
  104. package/framework/bias-library/cosmetic-refactor.md +0 -21
  105. package/framework/bias-library/enterprise-crud.md +0 -21
  106. package/framework/bias-library/fake-ui-slop.md +0 -20
  107. package/framework/bias-library/hallucinated-tools.md +0 -20
  108. package/framework/bias-library/missing-ui-states.md +0 -19
  109. package/framework/bias-library/over-indexing.md +0 -20
  110. package/framework/bias-library/swallow-errors.md +0 -19
  111. package/framework/bias-library/ui-only-security.md +0 -17
  112. package/framework/decision-primitives.md +0 -48
  113. package/framework/dial-library/complexity-budget.md +0 -13
  114. package/framework/dial-library/granularity.md +0 -13
  115. package/framework/dial-library/optimization-strategy.md +0 -13
  116. package/framework/dial-library/strictness.md +0 -13
  117. package/framework/rule-library/delegation-only.md +0 -9
  118. package/framework/rule-library/minimal-diff.md +0 -9
  119. package/framework/skill-schema.md +0 -310
  120. package/knowledge/backend/nodejs.md +0 -52
  121. package/knowledge/frontend/react.md +0 -81
  122. package/migrate-to-v6.js +0 -130
  123. package/migrate.js +0 -147
  124. package/migrate.py +0 -133
  125. package/migrate_all.cjs +0 -96
  126. package/patch.js +0 -15
  127. package/patch.py +0 -89
  128. package/patch2.py +0 -83
  129. package/rename.js +0 -64
  130. package/skills/_archive_old_skills/qk-accessibility-audit/SKILL.md +0 -121
  131. package/skills/_archive_old_skills/qk-agent-orchestrator/SKILL.md +0 -179
  132. package/skills/_archive_old_skills/qk-api-integration/SKILL.md +0 -389
  133. package/skills/_archive_old_skills/qk-auth-security/SKILL.md +0 -96
  134. package/skills/_archive_old_skills/qk-backend-architecture/SKILL.md +0 -125
  135. package/skills/_archive_old_skills/qk-bug-fix/SKILL.md +0 -213
  136. package/skills/_archive_old_skills/qk-component-generator/SKILL.md +0 -136
  137. package/skills/_archive_old_skills/qk-context-manager/SKILL.md +0 -175
  138. package/skills/_archive_old_skills/qk-database-engineer/SKILL.md +0 -104
  139. package/skills/_archive_old_skills/qk-deployment/SKILL.md +0 -96
  140. package/skills/_archive_old_skills/qk-design-system/SKILL.md +0 -137
  141. package/skills/_archive_old_skills/qk-form-builder/SKILL.md +0 -140
  142. package/skills/_archive_old_skills/qk-frontend-architecture/SKILL.md +0 -155
  143. package/skills/_archive_old_skills/qk-frontend-debug/SKILL.md +0 -133
  144. package/skills/_archive_old_skills/qk-frontend-performance/SKILL.md +0 -129
  145. package/skills/_archive_old_skills/qk-frontend-testing/SKILL.md +0 -146
  146. package/skills/_archive_old_skills/qk-git-engineer/SKILL.md +0 -304
  147. package/skills/_archive_old_skills/qk-help/SKILL.md +0 -68
  148. package/skills/_archive_old_skills/qk-migration/SKILL.md +0 -284
  149. package/skills/_archive_old_skills/qk-project-audit/SKILL.md +0 -280
  150. package/skills/_archive_old_skills/qk-refactor/SKILL.md +0 -222
  151. package/skills/_archive_old_skills/qk-state-management/SKILL.md +0 -140
  152. package/skills/_archive_old_skills/qk-table-crud-generator/SKILL.md +0 -127
  153. package/skills/_archive_old_skills/qk-ui-builder/SKILL.md +0 -152
  154. package/skills/_template/SKILL.md +0 -239
  155. package/skills/qk-access-policy/SKILL.md +0 -180
  156. package/skills/qk-ai-builder/SKILL.md +0 -216
  157. package/skills/qk-api-lifecycle/SKILL.md +0 -177
  158. package/skills/qk-bug-resolution/SKILL.md +0 -308
  159. package/skills/qk-context-loader/SKILL.md +0 -219
  160. package/skills/qk-data-lifecycle/SKILL.md +0 -193
  161. package/skills/qk-db-optimizer/SKILL.md +0 -197
  162. package/skills/qk-docs/SKILL.md +0 -199
  163. package/skills/qk-engineering-standard/SKILL.md +0 -352
  164. package/skills/qk-engineering-standard/rules/backend.md +0 -122
  165. package/skills/qk-engineering-standard/rules/database.md +0 -3
  166. package/skills/qk-engineering-standard/rules/frontend.md +0 -152
  167. package/skills/qk-engineering-standard/rules/security.md +0 -3
  168. package/skills/qk-engineering-standard/rules/testing.md +0 -3
  169. package/skills/qk-fe-api-integration/SKILL.md +0 -327
  170. package/skills/qk-feature-delivery/SKILL.md +0 -306
  171. package/skills/qk-help/SKILL.md +0 -194
  172. package/skills/qk-orchestrator/SKILL.md +0 -279
  173. package/skills/qk-orchestrator/references/routing-table.md +0 -78
  174. package/skills/qk-production-release/SKILL.md +0 -285
  175. package/skills/qk-project-bootstrap/SKILL.md +0 -236
  176. package/skills/qk-project-health/SKILL.md +0 -200
  177. package/skills/qk-project-memory/SKILL.md +0 -219
  178. package/skills/qk-system-evolution/SKILL.md +0 -282
  179. package/skills/qk-ui-audit/SKILL.md +0 -316
  180. package/skills/qk-ui-audit/references/anti-slop-checklist.md +0 -136
  181. package/skills/qk-ui-builder/SKILL.md +0 -447
  182. package/skills/qk-ui-builder/references/anti-patterns.md +0 -295
  183. package/skills/qk-ui-builder/references/color.md +0 -115
  184. package/skills/qk-ui-builder/references/component-cookbook.md +0 -1194
  185. package/skills/qk-ui-builder/references/copy.md +0 -250
  186. package/skills/qk-ui-builder/references/interaction-and-states.md +0 -115
  187. package/skills/qk-ui-builder/references/layout-and-space.md +0 -111
  188. package/skills/qk-ui-builder/references/macrostructures/01-bento-grid.md +0 -48
  189. package/skills/qk-ui-builder/references/macrostructures/02-long-document.md +0 -50
  190. package/skills/qk-ui-builder/references/macrostructures/03-marquee-hero.md +0 -51
  191. package/skills/qk-ui-builder/references/macrostructures/04-stat-led.md +0 -49
  192. package/skills/qk-ui-builder/references/macrostructures/05-workbench.md +0 -44
  193. package/skills/qk-ui-builder/references/macrostructures/06-conversational-faq.md +0 -50
  194. package/skills/qk-ui-builder/references/macrostructures/07-manifesto.md +0 -51
  195. package/skills/qk-ui-builder/references/macrostructures/08-photographic.md +0 -50
  196. package/skills/qk-ui-builder/references/macrostructures/09-quote-led.md +0 -50
  197. package/skills/qk-ui-builder/references/macrostructures/11-catalogue.md +0 -49
  198. package/skills/qk-ui-builder/references/macrostructures/12-letter.md +0 -49
  199. package/skills/qk-ui-builder/references/macrostructures/13-index-first.md +0 -49
  200. package/skills/qk-ui-builder/references/macrostructures/14-narrative-workflow.md +0 -48
  201. package/skills/qk-ui-builder/references/macrostructures/15-split-studio.md +0 -48
  202. package/skills/qk-ui-builder/references/macrostructures/16-feature-stack.md +0 -51
  203. package/skills/qk-ui-builder/references/macrostructures/17-type-specimen.md +0 -48
  204. package/skills/qk-ui-builder/references/macrostructures/18-portfolio-grid.md +0 -48
  205. package/skills/qk-ui-builder/references/macrostructures/19-map-diagram.md +0 -50
  206. package/skills/qk-ui-builder/references/macrostructures/20-ecosystem-index.md +0 -48
  207. package/skills/qk-ui-builder/references/macrostructures/21-component-playground.md +0 -45
  208. package/skills/qk-ui-builder/references/macrostructures.md +0 -38
  209. package/skills/qk-ui-builder/references/motion.md +0 -95
  210. package/skills/qk-ui-builder/references/responsive.md +0 -115
  211. package/skills/qk-ui-builder/references/slop-test.md +0 -135
  212. package/skills/qk-ui-builder/references/structure.md +0 -280
  213. package/skills/qk-ui-builder/references/themes/atmospheric.md +0 -53
  214. package/skills/qk-ui-builder/references/themes/carnival.md +0 -52
  215. package/skills/qk-ui-builder/references/themes/cobalt.md +0 -52
  216. package/skills/qk-ui-builder/references/themes/editorial.md +0 -52
  217. package/skills/qk-ui-builder/references/themes/garden.md +0 -52
  218. package/skills/qk-ui-builder/references/themes/hum.md +0 -52
  219. package/skills/qk-ui-builder/references/themes/lumen.md +0 -52
  220. package/skills/qk-ui-builder/references/themes/midnight.md +0 -52
  221. package/skills/qk-ui-builder/references/themes/modern-minimal.md +0 -52
  222. package/skills/qk-ui-builder/references/themes/playful.md +0 -52
  223. package/skills/qk-ui-builder/references/themes/specimen.md +0 -52
  224. package/skills/qk-ui-builder/references/themes/terminal.md +0 -52
  225. package/skills/qk-ui-builder/references/typography.md +0 -129
  226. package/skills/qk-ui-system-builder/SKILL.md +0 -222
  227. package/skills/qk-validation-gate/SKILL.md +0 -360
  228. package/skills.json +0 -820
  229. package/specs/contracts/behavior-contract.yaml +0 -40
  230. package/specs/expectations/qk-bug-resolution.yaml +0 -35
  231. package/specs/fixtures/user-payload.json +0 -12
  232. package/specs/regressions/api-integration-null-fields.yaml +0 -19
  233. package/specs/scenarios/fix-login-nullref.yaml +0 -3
  234. package/taste-skill/.claude-plugin/marketplace.json +0 -20
  235. package/taste-skill/.claude-plugin/plugin.json +0 -19
  236. package/taste-skill/.github/FUNDING.yml +0 -1
  237. package/taste-skill/.github/copilot-instructions.md +0 -11
  238. package/taste-skill/CHANGELOG.md +0 -111
  239. package/taste-skill/LICENSE +0 -21
  240. package/taste-skill/README.md +0 -212
  241. package/taste-skill/assets/.gitkeep +0 -0
  242. package/taste-skill/assets/readme-banner.webp +0 -0
  243. package/taste-skill/assets/readme-buttons/btn-agent-skills.webp +0 -0
  244. package/taste-skill/assets/readme-buttons/btn-changelog.webp +0 -0
  245. package/taste-skill/assets/readme-buttons/btn-mit.webp +0 -0
  246. package/taste-skill/assets/readme-buttons/btn-site.webp +0 -0
  247. package/taste-skill/assets/readme-buttons/btn-tools.webp +0 -0
  248. package/taste-skill/assets/readme-cta-tasteskill.svg +0 -5
  249. package/taste-skill/assets/sponsors/animations-dev.webp +0 -0
  250. package/taste-skill/assets/sponsors/emil-animations-dev.webp +0 -0
  251. package/taste-skill/assets/taste-skill-logo.png +0 -0
  252. package/taste-skill/assets/taste-skill-logo.webp +0 -0
  253. package/taste-skill/assets/vercel-oss-program-badge.svg +0 -44
  254. package/taste-skill/examples/floria-bottom.webp +0 -0
  255. package/taste-skill/examples/floria-full.webp +0 -0
  256. package/taste-skill/examples/floria-top.webp +0 -0
  257. package/taste-skill/research/README.md +0 -8
  258. package/taste-skill/research/laziness/README.md +0 -25
  259. package/taste-skill/research/laziness/findings/empirical-results.md +0 -58
  260. package/taste-skill/research/laziness/findings/references.md +0 -20
  261. package/taste-skill/research/laziness/remediation/architectural-patterns.md +0 -55
  262. package/taste-skill/research/laziness/remediation/parameter-tuning.md +0 -44
  263. package/taste-skill/research/laziness/remediation/prompt-engineering.md +0 -52
  264. package/taste-skill/research/laziness/remediation/reference-prompts.md +0 -79
  265. package/taste-skill/research/laziness/root-causes/cognitive-shortcuts.md +0 -23
  266. package/taste-skill/research/laziness/root-causes/output-limits.md +0 -39
  267. package/taste-skill/research/laziness/root-causes/rlhf-and-compute.md +0 -27
  268. package/taste-skill/research/laziness/root-causes/training-data-bias.md +0 -28
  269. package/taste-skill/scripts/build-emil-sponsor-row.mjs +0 -41
  270. package/taste-skill/scripts/convert-readme-assets-webp.mjs +0 -142
  271. package/taste-skill/scripts/process-readme-buttons.mjs +0 -108
  272. package/taste-skill/scripts/process-sponsor-badge.mjs +0 -83
  273. package/taste-skill/skill.sh +0 -25
  274. package/taste-skill/skills/brandkit/SKILL.md +0 -798
  275. package/taste-skill/skills/brutalist-skill/SKILL.md +0 -92
  276. package/taste-skill/skills/gpt-tasteskill/SKILL.md +0 -74
  277. package/taste-skill/skills/image-to-code-skill/SKILL.md +0 -1228
  278. package/taste-skill/skills/imagegen-frontend-mobile/SKILL.md +0 -1465
  279. package/taste-skill/skills/imagegen-frontend-web/SKILL.md +0 -987
  280. package/taste-skill/skills/llms.txt +0 -13
  281. package/taste-skill/skills/minimalist-skill/SKILL.md +0 -85
  282. package/taste-skill/skills/output-skill/SKILL.md +0 -49
  283. package/taste-skill/skills/redesign-skill/SKILL.md +0 -178
  284. package/taste-skill/skills/soft-skill/SKILL.md +0 -98
  285. package/taste-skill/skills/stitch-skill/DESIGN.md +0 -121
  286. package/taste-skill/skills/stitch-skill/SKILL.md +0 -184
  287. package/taste-skill/skills/taste-skill/SKILL.md +0 -1206
  288. package/taste-skill/skills/taste-skill-v1/SKILL.md +0 -226
  289. package/temp_fix.js +0 -61
  290. package/templates/DESIGN.md +0 -38
  291. package/templates/bug-report.md +0 -21
  292. package/templates/design-report.md +0 -21
  293. package/templates/feature-report.md +0 -20
  294. package/templates/review-report.md +0 -21
  295. package/templates/skill-template.md +0 -38
  296. package/tests/behavior-conformance.test.js +0 -154
  297. package/tests/install-script.test.js +0 -38
  298. package/tests/registry.test.js +0 -111
  299. package/update_template.js +0 -28
  300. package/vitest.config.js +0 -11
package/migrate-to-v6.js DELETED
@@ -1,130 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
- const skillsDir = path.join(__dirname, 'skills');
4
-
5
- function convertToBSF(content, name) {
6
- // Extract Frontmatter
7
- const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
8
- const fm = fmMatch ? fmMatch[1] : '';
9
-
10
- // Create v6 Frontmatter
11
- let newFm = '---\n';
12
- newFm += fm.split('\n').filter(line => {
13
- return !line.startsWith('behavior:') &&
14
- !line.startsWith('intent:') &&
15
- !line.startsWith('priority:') &&
16
- !line.startsWith('trigger:') &&
17
- !line.startsWith('inputs:') &&
18
- !line.startsWith('outputs:') &&
19
- !line.startsWith('allowed_tools:') &&
20
- !line.startsWith('pipeline:');
21
- }).join('\n');
22
- newFm += '\n---';
23
-
24
- const missionMatch = content.match(/## ?? Mission \(Scope\)\n([\s\S]*?)(?=\n## |\n---|$)/);
25
- const missionText = missionMatch ? missionMatch[1].trim() : 'Define mission here';
26
-
27
- const bsf = \\
28
-
29
- # ?? Behavior Specification: \
30
-
31
- ## 1. Behavior (�?nh danh H�nh vi)
32
- \\\yaml
33
- Mission: "Th?c thi nhi?m v? c?t l�i theo chu?n v6."
34
- Authority: "�u?c quy?n y�u c?u th�m th�ng tin n?u thi?u."
35
- Responsibility: "B?o d?m ch?t lu?ng d?u ra."
36
- Limitation: "Kh�ng vi ph?m Invariants c?a h? th?ng."
37
- \\\
38
-
39
- ## 2. Contracts (H?p d?ng)
40
-
41
- ### 2.1. Capability Contract
42
- \\\yaml
43
- Can:
44
- - read_code
45
- - execute_tests
46
- Must:
47
- - verify_assumptions_before_coding
48
- Cannot:
49
- - execute_destructive_commands
50
- \\\
51
-
52
- ### 2.2. Output Contract
53
- \\\yaml
54
- Artifacts:
55
- - summary_report
56
- Completion: "Artifacts generated & Quality Gates passed."
57
- \\\
58
-
59
- ## 3. Policies (Ch�nh s�ch)
60
-
61
- ### 3.1. Context Policy
62
- \\\yaml
63
- Scope: current_repo
64
- Priority:
65
- 1: Project Docs
66
- 2: Current Conversation
67
- Trust: "official docs > code > assumptions"
68
- Fallback: ask_user
69
- \\\
70
-
71
- ### 3.2. Reasoning Boundary
72
- \\\yaml
73
- May infer: "Bi?n s? c?c b?"
74
- Must verify: "Logic nghi?p v?"
75
- Must ask: "Y�u c?u m?p m?"
76
- Must refuse: "R?i ro b?o m?t"
77
- \\\
78
-
79
- ### 3.3. Decision Policy
80
- \\\yaml
81
- Priority:
82
- 1: correctness
83
- 2: safety
84
- 3: maintainability
85
- \\\
86
-
87
- ### 3.4. Evidence Policy
88
- \\\yaml
89
- Accept: [logs, unit tests]
90
- Prefer: [official vendor docs]
91
- Reject: [guesswork]
92
- \\\
93
-
94
- ### 3.5. Escalation Policy
95
- \\\yaml
96
- Warning: "Thay d?i c?u tr�c"
97
- Confirmation: "X�a file"
98
- Stop: "L?i Permission"
99
- \\\
100
-
101
- ## 4. Protocol (T�y ch?n)
102
-
103
- \\\yaml
104
- States:
105
- - collect_context
106
- - execute
107
-
108
- Transitions:
109
- collect_context:
110
- if context_missing: -> Stop
111
- else: -> execute
112
- execute: -> Done
113
- \\\
114
- \;
115
- return bsf.replace(/\n\n\n/g, '\n\n');
116
- }
117
-
118
- fs.readdirSync(skillsDir).forEach(dir => {
119
- const fullPath = path.join(skillsDir, dir);
120
- if (fs.statSync(fullPath).isDirectory() && !dir.startsWith('_archive')) {
121
- const skillPath = path.join(fullPath, 'SKILL.md');
122
- if (fs.existsSync(skillPath)) {
123
- if (dir === 'qk-bug-resolution') return; // already done
124
- const content = fs.readFileSync(skillPath, 'utf8');
125
- const newContent = convertToBSF(content, dir);
126
- fs.writeFileSync(skillPath, newContent);
127
- console.log('Converted ' + dir);
128
- }
129
- }
130
- });
package/migrate.js DELETED
@@ -1,147 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
- const skillsDir = path.join(__dirname, 'skills');
4
-
5
- function migrateSkill(skillDir) {
6
- const filePath = path.join(skillsDir, skillDir, 'SKILL.md');
7
- if (!fs.existsSync(filePath)) return;
8
-
9
- if (skillDir === 'qk-bug-resolution') return; // Skip already migrated
10
-
11
- let content = fs.readFileSync(filePath, 'utf8');
12
-
13
- // Parse Frontmatter
14
- const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
15
- if (!fmMatch) return;
16
- let frontmatter = fmMatch[1];
17
-
18
- // Filter old fields
19
- const validFields = [];
20
- const lines = frontmatter.split('\n');
21
- for (const line of lines) {
22
- if (!line.startsWith('behavior:') && !line.startsWith('intent:') && !line.startsWith('priority:') && !line.startsWith('trigger:') && !line.startsWith('inputs:') && !line.startsWith('outputs:') && !line.startsWith('allowed_tools:') && !line.startsWith('pipeline:')) {
23
- validFields.push(line.replace(/v5\.0/g, 'v6.0'));
24
- }
25
- }
26
- const newFm = '---\n' + validFields.join('\n') + '\n---';
27
-
28
- // Parse Mission
29
- let mission = 'Th?c thi nhi?m v? c?t l�i.';
30
- let limitation = 'Kh�ng vi ph?m Invariants c?a h? th?ng.';
31
-
32
- const missionSection = content.match(/## ?? Mission \(Scope\)[\s\S]*?(?=## |---|$)/);
33
- if (missionSection) {
34
- const missionLines = missionSection[0].split('\n');
35
- const posLines = missionLines.filter(l => l.includes('- ?')).map(l => l.replace('- ?', '').trim());
36
- const negLines = missionLines.filter(l => l.includes('- ?')).map(l => l.replace('- ?', '').trim());
37
-
38
- if (posLines.length > 0) mission = posLines.join(' ');
39
- if (negLines.length > 0) limitation = negLines.join(' ');
40
- }
41
-
42
- // Parse Biases (Map to Reasoning Boundary - Must refuse)
43
- const biasesMatch = content.match(/Biases:[\s\S]*?(?=---|$)/);
44
- let refuses = [];
45
- if (biasesMatch) {
46
- const biasLines = biasesMatch[0].split('\n').filter(l => l.includes('- id:'));
47
- refuses = biasLines.map(l => l.replace('- id:', '').trim());
48
- }
49
-
50
- // Parse Dials (Map to Context Policy / Reasoning)
51
- const dialsMatch = content.match(/Dials:[\s\S]*?(?=---|$)/);
52
- let asks = [];
53
- if (dialsMatch) {
54
- const dialLines = dialsMatch[0].split('\n').filter(l => l.includes('- id:'));
55
- asks = dialLines.map(l => l.replace('- id:', '').trim());
56
- }
57
-
58
- // Generate BSF content
59
- const bsfContent = \\
60
-
61
- # ?? Behavior Specification: \
62
-
63
- ## 1. Behavior (�?nh danh H�nh vi)
64
- \\\yaml
65
- Mission: "\"
66
- Authority: "�u?c quy?n th?c thi c�c t�c v? trong ph?m vi \."
67
- Responsibility: "B?o d?m ch?t lu?ng d?u ra v� tu�n th? chu?n h? th?ng."
68
- Limitation: "\"
69
- \\\
70
-
71
- ## 2. Contracts (H?p d?ng)
72
-
73
- ### 2.1. Capability Contract
74
- \\\yaml
75
- Can:
76
- - read_code
77
- - execute_tests
78
- - modify_code
79
- Must:
80
- - verify_assumptions_before_coding
81
- Cannot:
82
- - execute_destructive_commands
83
- - bypass_validation
84
- \\\
85
-
86
- ### 2.2. Output Contract
87
- \\\yaml
88
- Artifacts:
89
- - summary_report: "Decision Summary gi?i th�ch Context, Quy?t d?nh v� Trade-offs."
90
- Completion: "Nhi?m v? ho�n th�nh & Quality Gates passed."
91
- \\\
92
-
93
- ## 3. Policies (Ch�nh s�ch)
94
-
95
- ### 3.1. Context Policy
96
- \\\yaml
97
- Scope: current_repo
98
- Priority:
99
- 1: Project Docs
100
- 2: Current Conversation
101
- 3: Source Code
102
- Trust: "official docs > code > assumptions"
103
- Fallback: ask_user
104
- \\\
105
-
106
- ### 3.2. Reasoning Boundary
107
- \\\yaml
108
- May infer: "Bi?n s? c?c b?, logic n?i b? kh�ng ?nh hu?ng h? th?ng."
109
- Must verify: "T�c d?ng d?n c�c module kh�c."
110
- Must ask: "\"
111
- Must refuse: "\"
112
- \\\
113
-
114
- ### 3.3. Decision Policy
115
- \\\yaml
116
- Priority:
117
- 1: correctness
118
- 2: safety
119
- 3: maintainability
120
- 4: performance
121
- \\\
122
-
123
- ### 3.4. Evidence Policy
124
- \\\yaml
125
- Accept: [logs, unit tests, official docs]
126
- Prefer: [unit tests, CI results]
127
- Reject: [guesswork, outdated internet search]
128
- \\\
129
-
130
- ### 3.5. Escalation Policy
131
- \\\yaml
132
- Warning: "Thay d?i c?u tr�c ho?c public API"
133
- Confirmation: "Override config ho?c x�a file quan tr?ng"
134
- Stop: "L?i Permission ho?c xung d?t Invariants"
135
- \\\
136
- \;
137
-
138
- fs.writeFileSync(filePath, bsfContent);
139
- console.log('Migrated ' + skillDir);
140
- }
141
-
142
- const dirs = fs.readdirSync(skillsDir);
143
- for (const dir of dirs) {
144
- if (fs.statSync(path.join(skillsDir, dir)).isDirectory() && !dir.startsWith('_')) {
145
- migrateSkill(dir);
146
- }
147
- }
package/migrate.py DELETED
@@ -1,133 +0,0 @@
1
- import os
2
- import re
3
-
4
- skills_dir = os.path.join(os.getcwd(), 'skills')
5
-
6
- def migrate_skill(skill_dir):
7
- file_path = os.path.join(skills_dir, skill_dir, 'SKILL.md')
8
- if not os.path.exists(file_path): return
9
- if skill_dir in ['qk-bug-resolution', 'qk-access-policy']: return
10
-
11
- with open(file_path, 'r', encoding='utf-8') as f:
12
- content = f.read()
13
-
14
- fm_match = re.search(r'^---\n(.*?)\n---', content, re.DOTALL)
15
- if not fm_match: return
16
- frontmatter = fm_match.group(1)
17
-
18
- valid_fields = []
19
- for line in frontmatter.split('\n'):
20
- if not any(line.startswith(prefix) for prefix in ['behavior:', 'intent:', 'priority:', 'trigger:', 'inputs:', 'outputs:', 'allowed_tools:', 'pipeline:']):
21
- valid_fields.append(line.replace('v5.0', 'v6.0'))
22
-
23
- new_fm = '---\n' + '\n'.join(valid_fields) + '\n---'
24
-
25
- mission = f'Th?c thi nhi?m v? c?t l�i c?a {skill_dir}'
26
- limitation = 'Kh�ng vi ph?m Invariants c?a h? th?ng.'
27
-
28
- mission_section = re.search(r'## .*?Mission \(Scope\)(.*?)(?=## |---|$)', content, re.DOTALL)
29
- if mission_section:
30
- lines = mission_section.group(1).split('\n')
31
- pos = [l.split('- ?')[-1].strip() for l in lines if '- ?' in l]
32
- neg = [l.split('- ?')[-1].strip() for l in lines if '- ?' in l]
33
- if pos: mission = ' '.join(pos)
34
- if neg: limitation = ' '.join(neg)
35
-
36
- biases_match = re.search(r'Biases:(.*?)(?=---|$)', content, re.DOTALL)
37
- refuses = []
38
- if biases_match:
39
- refuses = [l.replace('- id:', '').strip() for l in biases_match.group(1).split('\n') if '- id:' in l]
40
-
41
- dials_match = re.search(r'Dials:(.*?)(?=---|$)', content, re.DOTALL)
42
- asks = []
43
- if dials_match:
44
- asks = [l.replace('- id:', '').strip() for l in dials_match.group(1).split('\n') if '- id:' in l]
45
-
46
- must_ask = ', '.join(asks) if asks else 'Y�u c?u m?p m?, thi?u th�ng tin.'
47
- must_refuse = ', '.join(refuses) if refuses else 'R?i ro b?o m?t, ph� v? ki?n tr�c.'
48
-
49
- bsf_content = f'''{new_fm}
50
-
51
- # ?? Behavior Specification: {skill_dir}
52
-
53
- ## 1. Behavior (�?nh danh H�nh vi)
54
- `yaml
55
- Mission: "{mission.replace('"', "'")}"
56
- Authority: "�u?c quy?n th?c thi c�c t�c v? trong ph?m vi {skill_dir}."
57
- Responsibility: "B?o d?m ch?t lu?ng d?u ra v� tu�n th? chu?n h? th?ng."
58
- Limitation: "{limitation.replace('"', "'")}"
59
- `
60
-
61
- ## 2. Contracts (H?p d?ng)
62
-
63
- ### 2.1. Capability Contract
64
- `yaml
65
- Can:
66
- - read_code
67
- - execute_tests
68
- - modify_code
69
- Must:
70
- - verify_assumptions_before_coding
71
- Cannot:
72
- - execute_destructive_commands
73
- - bypass_validation
74
- `
75
-
76
- ### 2.2. Output Contract
77
- `yaml
78
- Artifacts:
79
- - summary_report: "Decision Summary gi?i th�ch Context, Quy?t d?nh v� Trade-offs."
80
- Completion: "Nhi?m v? ho�n th�nh & Quality Gates passed."
81
- `
82
-
83
- ## 3. Policies (Ch�nh s�ch)
84
-
85
- ### 3.1. Context Policy
86
- `yaml
87
- Scope: current_repo
88
- Priority:
89
- 1: Project Docs
90
- 2: Current Conversation
91
- 3: Source Code
92
- Trust: "official docs > code > assumptions"
93
- Fallback: ask_user
94
- `
95
-
96
- ### 3.2. Reasoning Boundary
97
- `yaml
98
- May infer: "Bi?n s? c?c b?, logic n?i b? kh�ng ?nh hu?ng h? th?ng."
99
- Must verify: "T�c d?ng d?n c�c module kh�c."
100
- Must ask: "{must_ask.replace('"', "'")}"
101
- Must refuse: "{must_refuse.replace('"', "'")}"
102
- `
103
-
104
- ### 3.3. Decision Policy
105
- `yaml
106
- Priority:
107
- 1: correctness
108
- 2: safety
109
- 3: maintainability
110
- 4: performance
111
- `
112
-
113
- ### 3.4. Evidence Policy
114
- `yaml
115
- Accept: [logs, unit tests, official docs]
116
- Prefer: [unit tests, CI results]
117
- Reject: [guesswork, outdated internet search]
118
- `
119
-
120
- ### 3.5. Escalation Policy
121
- `yaml
122
- Warning: "Thay d?i c?u tr�c ho?c public API"
123
- Confirmation: "Override config ho?c x�a file quan tr?ng"
124
- Stop: "L?i Permission ho?c xung d?t Invariants"
125
- `
126
- '''
127
- with open(file_path, 'w', encoding='utf-8') as f:
128
- f.write(bsf_content)
129
- print(f'Migrated {skill_dir}')
130
-
131
- for d in os.listdir(skills_dir):
132
- if os.path.isdir(os.path.join(skills_dir, d)) and not d.startswith('_'):
133
- migrate_skill(d)
package/migrate_all.cjs DELETED
@@ -1,96 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
- const skillsDir = path.join(__dirname, 'skills');
4
-
5
- const template = `---
6
- name: {NAME}
7
- version: 6.0.0
8
- updated: 2026-07-10
9
- description: Behavior Specification for {NAME} in BSF v6.0 format.
10
- category: orchestration
11
- tags: [bsf, v6]
12
- platforms: [claude-code, cursor, windsurf, gemini-cli]
13
- ---
14
-
15
- # Behavior Specification: {NAME}
16
-
17
- ## 1. Behavior
18
- \`\`\`yaml
19
- Mission: "Execute core tasks for {NAME}."
20
- Authority: "Full authority within the scope of {NAME}."
21
- Responsibility: "Ensure the system complies with v6 standards."
22
- Limitation: "Do not violate System Invariants."
23
- \`\`\`
24
-
25
- ## 2. Contracts
26
-
27
- ### 2.1. Capability Contract
28
- \`\`\`yaml
29
- Can:
30
- - read_code
31
- - modify_code
32
- Must:
33
- - verify_assumptions_before_coding
34
- Cannot:
35
- - bypass_validation
36
- \`\`\`
37
-
38
- ### 2.2. Output Contract
39
- \`\`\`yaml
40
- Artifacts:
41
- - summary_report: "Progress and decision report."
42
- Completion: "Feature works & Quality Gates passed."
43
- \`\`\`
44
-
45
- ## 3. Policies
46
-
47
- ### 3.1. Context Policy
48
- \`\`\`yaml
49
- Scope: whole_workspace
50
- Priority:
51
- 1: Project Guidelines
52
- 2: Current Code
53
- Trust: "official docs > code > user assumptions"
54
- Fallback: ask_user
55
- \`\`\`
56
-
57
- ### 3.2. Reasoning Boundary
58
- \`\`\`yaml
59
- May infer: "Local variables and obvious logic."
60
- Must verify: "Cross-module impacts."
61
- Must ask: "Vague requirements, missing context."
62
- Must refuse: "Security risks, baseless guesses."
63
- \`\`\`
64
-
65
- ### 3.3. Decision Policy
66
- \`\`\`yaml
67
- Priority:
68
- 1: correctness
69
- 2: safety
70
- 3: maintainability
71
- \`\`\`
72
-
73
- ### 3.4. Evidence Policy
74
- \`\`\`yaml
75
- Accept: [unit tests, CI logs]
76
- Prefer: [end-to-end tests]
77
- Reject: [guesswork]
78
- \`\`\`
79
-
80
- ### 3.5. Escalation Policy
81
- \`\`\`yaml
82
- Warning: "Changing task scope."
83
- Confirmation: "Overriding config or deleting files."
84
- Stop: "Critical security error."
85
- \`\`\`
86
- `;
87
-
88
- const dirs = fs.readdirSync(skillsDir);
89
- for (const dir of dirs) {
90
- if (dir.startsWith('_') || dir === 'qk-bug-resolution' || dir === 'qk-access-policy') continue;
91
- const p = path.join(skillsDir, dir, 'SKILL.md');
92
- if (fs.existsSync(p)) {
93
- fs.writeFileSync(p, template.replace(/{NAME}/g, dir), 'utf8');
94
- console.log('Updated ' + dir);
95
- }
96
- }
package/patch.js DELETED
@@ -1,15 +0,0 @@
1
- const fs = require('fs');
2
- let content = fs.readFileSync('bin/install.js', 'utf8');
3
-
4
- // Fix kiloConfig bug
5
- content = content.replace(
6
- "if (!Array.isArray(kiloConfig.skills) || typeof kiloConfig.skills !== 'object' || !kiloConfig.skills.paths) {",
7
- "if (!kiloConfig.skills || typeof kiloConfig.skills !== 'object' || Array.isArray(kiloConfig.skills) || !kiloConfig.skills.paths) {"
8
- );
9
-
10
- // Replace interactive prompt
11
- const startMarker = "rl.question(questionIde, (answerIde) => {";
12
- const endMarker = "} catch (error) {\\n console.error('? C� l?i x?y ra trong qu� tr�nh c�i d?t:', error.message);\\n } finally {\\n rl.close();\\n }\\n });\\n});";
13
-
14
- const startIdx = content.indexOf(startMarker);
15
- // Actually simpler regex
package/patch.py DELETED
@@ -1,89 +0,0 @@
1
- import sys
2
- with open('bin/install.js', 'r', encoding='utf-8') as f:
3
- content = f.read()
4
-
5
- # Fix kiloConfig bug
6
- content = content.replace(
7
- "if (!Array.isArray(kiloConfig.skills) || typeof kiloConfig.skills !== 'object' || !kiloConfig.skills.paths) {",
8
- "if (!kiloConfig.skills || typeof kiloConfig.skills !== 'object' || Array.isArray(kiloConfig.skills) || !kiloConfig.skills.paths) {"
9
- )
10
-
11
- # Replace the interactive part with CLI parsing
12
- start_marker = "rl.question(questionIde, (ideChoice) => {"
13
- end_marker = " } catch (error) {\n console.error('? C� l?i x?y ra trong qu� tr�nh c�i d?t:', error.message);\n } finally {\n rl.close();\n }\n });\n});"
14
-
15
- start_idx = content.find(start_marker)
16
- end_idx = content.find(end_marker) + len(end_marker)
17
-
18
- if start_idx != -1 and end_idx != -1:
19
- replacement = """// Parse command line arguments for CI/CD automation
20
- const args = process.argv.slice(2);
21
- let autoIde = null;
22
- let autoScope = null;
23
-
24
- for (let i = 0; i < args.length; i++) {
25
- if (args[i].startsWith('--ide=')) {
26
- autoIde = args[i].split('=')[1];
27
- }
28
- if (args[i].startsWith('--scope=')) {
29
- autoScope = args[i].split('=')[1];
30
- }
31
- }
32
-
33
- function runInstallation(ideChoice, scopeChoice) {
34
- const isGlobal = scopeChoice === '1';
35
- """
36
-
37
- old_body = content[start_idx:end_idx]
38
-
39
- # Extract the body inside rl.question(questionScope...)
40
- scope_start = "const isGlobal = scopeChoice === '1';"
41
- scope_start_idx = old_body.find(scope_start)
42
- scope_end = " } catch (error) {"
43
- scope_end_idx = old_body.find(scope_end)
44
-
45
- inner_body = old_body[scope_start_idx + len(scope_start):scope_end_idx]
46
-
47
- replacement += inner_body
48
- replacement += """
49
- } catch (error) {
50
- console.error('? C� l?i x?y ra trong qu� tr�nh c�i d?t:', error.message);
51
- } finally {
52
- rl.close();
53
- }
54
- }
55
-
56
- if (autoIde && autoScope) {
57
- console.log('\\n?? Running in non-interactive mode with IDE=' + autoIde + ', Scope=' + autoScope);
58
- runInstallation(autoIde, autoScope);
59
- } else {
60
- rl.question(questionIde, (ideChoice) => {
61
- if (ideChoice === '0') {
62
- console.log('? �� b? qua c?u h�nh t? d?ng. Skill OS v?n du?c t?i v?, b?n c� th? t? c?u h�nh file c?a IDE theo thu m?c hi?n t?i.');
63
- rl.close();
64
- return;
65
- }
66
-
67
- if (!['1', '2', '3', '4', '5', '6', '7'].includes(ideChoice)) {
68
- console.log('? L?a ch?n kh�ng h?p l?. Vui l�ng ch?y l?i script.');
69
- rl.close();
70
- return;
71
- }
72
-
73
- rl.question(questionScope, (scopeChoice) => {
74
- if (!['1', '2'].includes(scopeChoice)) {
75
- console.log('? L?a ch?n kh�ng h?p l?. M?c d?nh s? c�i Global.');
76
- scopeChoice = '1';
77
- }
78
- runInstallation(ideChoice, scopeChoice);
79
- });
80
- });
81
- }
82
- """
83
- content = content[:start_idx] + replacement + content[end_idx:]
84
-
85
- with open('bin/install.js', 'w', encoding='utf-8') as f:
86
- f.write(content)
87
- print("Python patch applied.")
88
- else:
89
- print("Could not find markers.")
package/patch2.py DELETED
@@ -1,83 +0,0 @@
1
- import sys
2
- with open('bin/install.js', 'r', encoding='utf-8') as f:
3
- content = f.read()
4
-
5
- # Fix kiloConfig bug
6
- content = content.replace(
7
- "if (!Array.isArray(kiloConfig.skills) || typeof kiloConfig.skills !== 'object' || !kiloConfig.skills.paths) {",
8
- "if (!kiloConfig.skills || typeof kiloConfig.skills !== 'object' || Array.isArray(kiloConfig.skills) || !kiloConfig.skills.paths) {"
9
- )
10
-
11
- # Replace the interactive part with CLI parsing
12
- start_marker = "rl.question(questionIde, (answerIde) => {"
13
- end_marker = " } catch (error) {\n console.error('? C� l?i x?y ra trong qu� tr�nh c�i d?t:', error.message);\n } finally {\n rl.close();\n }\n });\n});"
14
-
15
- start_idx = content.find(start_marker)
16
- end_idx = content.find(end_marker) + len(end_marker)
17
-
18
- if start_idx != -1 and end_idx != -1:
19
- replacement = """// Parse command line arguments for CI/CD automation
20
- const args = process.argv.slice(2);
21
- let autoIde = null;
22
- let autoScope = null;
23
-
24
- for (let i = 0; i < args.length; i++) {
25
- if (args[i].startsWith('--ide=')) {
26
- autoIde = args[i].split('=')[1];
27
- }
28
- if (args[i].startsWith('--scope=')) {
29
- autoScope = args[i].split('=')[1];
30
- }
31
- }
32
-
33
- function runInstallation(answerIde, answerScope) {
34
- """
35
-
36
- old_body = content[start_idx:end_idx]
37
-
38
- # Extract the body inside rl.question(questionScope...)
39
- scope_start = "rl.question(questionScope, (answerScope) => {"
40
- scope_start_idx = old_body.find(scope_start) + len(scope_start)
41
- scope_end = " } catch (error) {"
42
- scope_end_idx = old_body.find(scope_end)
43
-
44
- # Extract the ide logic before scope question
45
- ide_logic_start_idx = old_body.find(" let isGemini = false;")
46
- ide_logic_end_idx = old_body.find(scope_start)
47
- ide_logic = old_body[ide_logic_start_idx:ide_logic_end_idx]
48
-
49
- inner_body = old_body[scope_start_idx:scope_end_idx]
50
-
51
- replacement += ide_logic
52
- replacement += inner_body
53
- replacement += """
54
- } catch (error) {
55
- console.error('? Error during installation:', error.message);
56
- } finally {
57
- if (rl) rl.close();
58
- }
59
- }
60
-
61
- if (autoIde && autoScope) {
62
- console.log('\\n?? Running in non-interactive mode with IDE=' + autoIde + ', Scope=' + autoScope);
63
- runInstallation(autoIde, autoScope);
64
- } else {
65
- rl.question(questionIde, (answerIde) => {
66
- if (answerIde.trim() === '0') {
67
- console.log('? B? qua c�i d?t t? d?ng.');
68
- rl.close();
69
- return;
70
- }
71
- rl.question(questionScope, (answerScope) => {
72
- runInstallation(answerIde, answerScope);
73
- });
74
- });
75
- }
76
- """
77
- content = content[:start_idx] + replacement + content[end_idx:]
78
-
79
- with open('bin/install.js', 'w', encoding='utf-8') as f:
80
- f.write(content)
81
- print("Python patch applied.")
82
- else:
83
- print("Could not find markers.")