@qualisoft/ai-skills 1.0.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 (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/bin/cli.mjs +331 -0
  4. package/package.json +53 -0
  5. package/skills/erd-visual/SKILL.md +294 -0
  6. package/skills/erd-visual/build.mjs +404 -0
  7. package/skills/erd-visual/engine/dbml.mjs +133 -0
  8. package/skills/erd-visual/engine/ingest.mjs +273 -0
  9. package/skills/erd-visual/engine/layout.mjs +165 -0
  10. package/skills/erd-visual/engine/overview.mjs +314 -0
  11. package/skills/erd-visual/engine/render.mjs +144 -0
  12. package/skills/erd-visual/engine/router.mjs +401 -0
  13. package/skills/erd-visual/engine/verify.mjs +138 -0
  14. package/skills/erd-visual/engine/wire.mjs +115 -0
  15. package/skills/erd-visual/fixtures/crm-large.dbml +1337 -0
  16. package/skills/erd-visual/fixtures/edge-cases.dbml +43 -0
  17. package/skills/erd-visual/fixtures/map-dynamics.json +32 -0
  18. package/skills/erd-visual/fixtures/shop-basic.dbml +78 -0
  19. package/skills/erd-visual/fixtures/src-json/api.json +38 -0
  20. package/skills/erd-visual/fixtures/src-prisma/schema.prisma +44 -0
  21. package/skills/erd-visual/fixtures/src-sql/shop.sql +62 -0
  22. package/skills/erd-visual/readers/csv.mjs +81 -0
  23. package/skills/erd-visual/readers/index.mjs +55 -0
  24. package/skills/erd-visual/readers/jsonschema.mjs +86 -0
  25. package/skills/erd-visual/readers/prisma.mjs +102 -0
  26. package/skills/erd-visual/readers/sql.mjs +205 -0
  27. package/skills/erd-visual/readers/xlsx.mjs +220 -0
  28. package/skills/erd-visual/readers/xml.mjs +130 -0
  29. package/skills/erd-visual/readers/zip.mjs +74 -0
  30. package/skills/erd-visual/viewer/index.html +539 -0
  31. package/skills/project-build/SKILL.md +171 -0
  32. package/skills/project-build/templates/build-rules.md +88 -0
  33. package/skills/project-build/templates/change-log.md +29 -0
  34. package/skills/project-build/templates/coverage.md +49 -0
  35. package/skills/project-build/templates/parity.html +375 -0
  36. package/skills/project-build/templates/theme.css +45 -0
  37. package/skills/project-design/MEDIUMS.md +104 -0
  38. package/skills/project-design/QUESTIONS.md +126 -0
  39. package/skills/project-design/SKILL.md +365 -0
  40. package/skills/project-design/templates/audit.html +689 -0
  41. package/skills/project-design/templates/change-log.md +53 -0
  42. package/skills/project-design/templates/design-rules.md +118 -0
  43. package/skills/project-design/templates/mockup-app.html +96 -0
  44. package/skills/project-design/templates/mockup-slides.html +82 -0
  45. package/skills/project-design/templates/mockup-web.html +45 -0
  46. package/skills/project-design/templates/styleguide.html +436 -0
  47. package/skills/project-design/templates/tokens.css +69 -0
  48. package/skills/project-design/templates/tone-options.html +138 -0
  49. package/skills/project-init/GUIDE.md +370 -0
  50. package/skills/project-init/RUNBOOK.md +192 -0
  51. package/skills/project-init/SKILL.md +382 -0
  52. package/skills/project-init/build.mjs +2898 -0
  53. package/skills/project-init/evals/RUBRIC.md +81 -0
  54. package/skills/project-init/evals/cases/conflicting.expect.json +17 -0
  55. package/skills/project-init/evals/cases/conflicting.md +9 -0
  56. package/skills/project-init/evals/cases/vague-idea.expect.json +11 -0
  57. package/skills/project-init/evals/cases/vague-idea.md +7 -0
  58. package/skills/project-init/evals/cases/well-formed.expect.json +18 -0
  59. package/skills/project-init/evals/cases/well-formed.md +28 -0
  60. package/skills/project-init/markdown.mjs +0 -0
  61. package/skills/project-init/modules/a11y.json +46 -0
  62. package/skills/project-init/modules/ai.json +77 -0
  63. package/skills/project-init/modules/audience.json +48 -0
  64. package/skills/project-init/modules/backend.json +129 -0
  65. package/skills/project-init/modules/brand.json +78 -0
  66. package/skills/project-init/modules/core.json +132 -0
  67. package/skills/project-init/modules/design.json +72 -0
  68. package/skills/project-init/modules/engineering.json +86 -0
  69. package/skills/project-init/modules/mobile.json +22 -0
  70. package/skills/project-init/modules/ops.json +122 -0
  71. package/skills/project-init/modules/process.json +104 -0
  72. package/skills/project-init/modules/product.json +37 -0
  73. package/skills/project-init/modules/ux.json +52 -0
  74. package/skills/project-init/modules/web.json +129 -0
  75. package/skills/project-init/presets/ai-product.json +12 -0
  76. package/skills/project-init/presets/internal-system.json +15 -0
  77. package/skills/project-init/presets/mobile-app.json +20 -0
  78. package/skills/project-init/presets/web-corporate.json +116 -0
  79. package/skills/project-init/schema.json +80 -0
  80. package/skills/project-init/templates/log.md +54 -0
  81. package/skills/project-init/templates/readme.md +62 -0
  82. package/skills/project-init/templates/reference.md +34 -0
  83. package/skills/project-init/templates/register.md +63 -0
  84. package/skills/project-init/templates/spec.md +46 -0
  85. package/skills/project-interview/INTERVIEW.md +221 -0
  86. package/skills/project-interview/SKILL.md +156 -0
  87. package/skills/project-interview/fixtures/brief.md +49 -0
  88. package/skills/project-interview/fixtures/decisions.md +13 -0
  89. package/skills/project-interview/fixtures/open-questions.md +9 -0
  90. package/skills/project-interview/templates/brief.md +179 -0
  91. package/skills/project-interview/templates/decisions.md +55 -0
  92. package/skills/project-interview/templates/open-questions.md +40 -0
  93. package/skills/project-interview/validate.mjs +49 -0
@@ -0,0 +1,40 @@
1
+ ---
2
+ id: discovery-open-questions
3
+ title: 인터뷰 미결 사항
4
+ summary: 1단계에서 답이 나오지 않은 것. 2단계가 등급을 매겨 리스크 대장으로 올린다.
5
+ date: {{YYYY-MM-DD}}
6
+ ---
7
+
8
+ # 인터뷰 미결 사항
9
+
10
+ > **1단계 기록이다.** 2단계의 리스크 대장과 별개다.
11
+ > 여기는 *묻고 답을 못 받은 것*이 쌓이고,
12
+ > 2단계는 그중 프로젝트를 막는 것을 `B-`/`H-`/`M-` 등급으로 승격시킨다.
13
+
14
+ ## 기록 규칙
15
+
16
+ - 사용자가 **"모르겠다" / "나중에" / "확인해봐야 안다"** 라고 한 항목을 그대로 적는다.
17
+ - 대신 정하지 않는다. 추정으로 채우면 2단계가 이걸 리스크로 인식할 기회를 잃는다.
18
+ - ID는 `OQ-01` 형식. 2단계의 `B-01` `H-01` `M-01`과 구분된다.
19
+
20
+ ## 미결 목록
21
+
22
+ | ID | 일자 | AI | 계정 | 항목 | 왜 필요한가 | 답이 없으면 무엇이 막히는가 | 결정 주체 |
23
+ | --- | --- | --- | --- | --- | --- | --- | --- |
24
+ | OQ-01 | `{{YYYY-MM-DD HH:mm}}` | `{{AI}}` | `{{계정}}` | | | | |
25
+
26
+ ## 답을 못 받은 이유 (선택)
27
+
28
+ 같은 질문이 반복되지 않도록, 왜 답이 안 나왔는지 남겨두면 도움이 된다.
29
+
30
+ | ID | 사유 |
31
+ | --- | --- |
32
+ | | 아직 내부 논의 전 / 담당자 부재 / 예산 확정 전 / 질문이 이해되지 않음 |
33
+
34
+ ## 2단계 승격 상태
35
+
36
+ > 2단계가 원본 OQ를 지우지 않고 `리스크 ID`, `차단 단계`, `현재 상태`, `해소 결정 ID`를 채운다.
37
+
38
+ | OQ | 리스크 ID | 차단 단계 | 현재 상태 | 해소 결정 ID |
39
+ | --- | --- | --- | --- | --- |
40
+ | OQ-01 | | | 미승격 | |
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+
4
+ const [briefPath, decisionsPath, questionsPath] = process.argv.slice(2);
5
+ if (!briefPath || !decisionsPath || !questionsPath) {
6
+ console.error("사용법: node validate.mjs <기획안> <결정기록> <미결기록>");
7
+ process.exit(1);
8
+ }
9
+
10
+ const read = (path) => readFileSync(path, "utf8");
11
+ const brief = read(briefPath);
12
+ const decisions = read(decisionsPath);
13
+ const questions = read(questionsPath);
14
+ const optionIds = [
15
+ "seo", "naver", "geo", "analytics", "tagmanager", "adtracking", "consent",
16
+ "a11y", "perfbudget", "i18n", "cms", "contactform", "darkmode",
17
+ ];
18
+ const errors = [];
19
+
20
+ const profileAxes = {
21
+ scale: ["solo", "small", "standard", "large"],
22
+ risk: ["low", "standard", "regulated"],
23
+ delivery: ["prototype", "mvp", "production"],
24
+ };
25
+ for (const [axis, levels] of Object.entries(profileAxes)) {
26
+ if (!new RegExp(`^ ${axis}: (${levels.join("|")})$`, "m").test(brief)) {
27
+ errors.push(`profile.${axis} 누락 또는 값 오류 (${levels.join(" | ")})`);
28
+ }
29
+ }
30
+ for (const id of optionIds) {
31
+ if (!new RegExp(`^ ${id}: (true|false|unknown)$`, "m").test(brief)) {
32
+ errors.push(`option_hints 누락 또는 값 오류: ${id}`);
33
+ }
34
+ }
35
+ for (const title of ["최종 목표 범위", "첫 출시 범위", "이번에 하지 않는 것",
36
+ "산출물 범위", "만들지 않기로 한 것"]) {
37
+ if (!brief.includes(title)) errors.push(`기획안 필수 항목 누락: ${title}`);
38
+ }
39
+ const meta = /\| `\d{4}-\d{2}-\d{2} \d{2}:\d{2}` \| `[^`]+` \| `[^`]+` \|/;
40
+ if (/DI-\d+/.test(decisions) && !meta.test(decisions)) errors.push("DI 작성자 속성 표 누락");
41
+ if (/OQ-\d+/.test(questions) && !/\d{4}-\d{2}-\d{2} \d{2}:\d{2}/.test(questions)) {
42
+ errors.push("OQ 일자(분 단위) 누락");
43
+ }
44
+
45
+ if (errors.length) {
46
+ for (const error of errors) console.error("- " + error);
47
+ process.exit(1);
48
+ }
49
+ console.log("project-interview 전달 계약 검증 통과");