@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.
- package/LICENSE +21 -0
- package/README.md +234 -0
- package/bin/cli.mjs +331 -0
- package/package.json +53 -0
- package/skills/erd-visual/SKILL.md +294 -0
- package/skills/erd-visual/build.mjs +404 -0
- package/skills/erd-visual/engine/dbml.mjs +133 -0
- package/skills/erd-visual/engine/ingest.mjs +273 -0
- package/skills/erd-visual/engine/layout.mjs +165 -0
- package/skills/erd-visual/engine/overview.mjs +314 -0
- package/skills/erd-visual/engine/render.mjs +144 -0
- package/skills/erd-visual/engine/router.mjs +401 -0
- package/skills/erd-visual/engine/verify.mjs +138 -0
- package/skills/erd-visual/engine/wire.mjs +115 -0
- package/skills/erd-visual/fixtures/crm-large.dbml +1337 -0
- package/skills/erd-visual/fixtures/edge-cases.dbml +43 -0
- package/skills/erd-visual/fixtures/map-dynamics.json +32 -0
- package/skills/erd-visual/fixtures/shop-basic.dbml +78 -0
- package/skills/erd-visual/fixtures/src-json/api.json +38 -0
- package/skills/erd-visual/fixtures/src-prisma/schema.prisma +44 -0
- package/skills/erd-visual/fixtures/src-sql/shop.sql +62 -0
- package/skills/erd-visual/readers/csv.mjs +81 -0
- package/skills/erd-visual/readers/index.mjs +55 -0
- package/skills/erd-visual/readers/jsonschema.mjs +86 -0
- package/skills/erd-visual/readers/prisma.mjs +102 -0
- package/skills/erd-visual/readers/sql.mjs +205 -0
- package/skills/erd-visual/readers/xlsx.mjs +220 -0
- package/skills/erd-visual/readers/xml.mjs +130 -0
- package/skills/erd-visual/readers/zip.mjs +74 -0
- package/skills/erd-visual/viewer/index.html +539 -0
- package/skills/project-build/SKILL.md +171 -0
- package/skills/project-build/templates/build-rules.md +88 -0
- package/skills/project-build/templates/change-log.md +29 -0
- package/skills/project-build/templates/coverage.md +49 -0
- package/skills/project-build/templates/parity.html +375 -0
- package/skills/project-build/templates/theme.css +45 -0
- package/skills/project-design/MEDIUMS.md +104 -0
- package/skills/project-design/QUESTIONS.md +126 -0
- package/skills/project-design/SKILL.md +365 -0
- package/skills/project-design/templates/audit.html +689 -0
- package/skills/project-design/templates/change-log.md +53 -0
- package/skills/project-design/templates/design-rules.md +118 -0
- package/skills/project-design/templates/mockup-app.html +96 -0
- package/skills/project-design/templates/mockup-slides.html +82 -0
- package/skills/project-design/templates/mockup-web.html +45 -0
- package/skills/project-design/templates/styleguide.html +436 -0
- package/skills/project-design/templates/tokens.css +69 -0
- package/skills/project-design/templates/tone-options.html +138 -0
- package/skills/project-init/GUIDE.md +370 -0
- package/skills/project-init/RUNBOOK.md +192 -0
- package/skills/project-init/SKILL.md +382 -0
- package/skills/project-init/build.mjs +2898 -0
- package/skills/project-init/evals/RUBRIC.md +81 -0
- package/skills/project-init/evals/cases/conflicting.expect.json +17 -0
- package/skills/project-init/evals/cases/conflicting.md +9 -0
- package/skills/project-init/evals/cases/vague-idea.expect.json +11 -0
- package/skills/project-init/evals/cases/vague-idea.md +7 -0
- package/skills/project-init/evals/cases/well-formed.expect.json +18 -0
- package/skills/project-init/evals/cases/well-formed.md +28 -0
- package/skills/project-init/markdown.mjs +0 -0
- package/skills/project-init/modules/a11y.json +46 -0
- package/skills/project-init/modules/ai.json +77 -0
- package/skills/project-init/modules/audience.json +48 -0
- package/skills/project-init/modules/backend.json +129 -0
- package/skills/project-init/modules/brand.json +78 -0
- package/skills/project-init/modules/core.json +132 -0
- package/skills/project-init/modules/design.json +72 -0
- package/skills/project-init/modules/engineering.json +86 -0
- package/skills/project-init/modules/mobile.json +22 -0
- package/skills/project-init/modules/ops.json +122 -0
- package/skills/project-init/modules/process.json +104 -0
- package/skills/project-init/modules/product.json +37 -0
- package/skills/project-init/modules/ux.json +52 -0
- package/skills/project-init/modules/web.json +129 -0
- package/skills/project-init/presets/ai-product.json +12 -0
- package/skills/project-init/presets/internal-system.json +15 -0
- package/skills/project-init/presets/mobile-app.json +20 -0
- package/skills/project-init/presets/web-corporate.json +116 -0
- package/skills/project-init/schema.json +80 -0
- package/skills/project-init/templates/log.md +54 -0
- package/skills/project-init/templates/readme.md +62 -0
- package/skills/project-init/templates/reference.md +34 -0
- package/skills/project-init/templates/register.md +63 -0
- package/skills/project-init/templates/spec.md +46 -0
- package/skills/project-interview/INTERVIEW.md +221 -0
- package/skills/project-interview/SKILL.md +156 -0
- package/skills/project-interview/fixtures/brief.md +49 -0
- package/skills/project-interview/fixtures/decisions.md +13 -0
- package/skills/project-interview/fixtures/open-questions.md +9 -0
- package/skills/project-interview/templates/brief.md +179 -0
- package/skills/project-interview/templates/decisions.md +55 -0
- package/skills/project-interview/templates/open-questions.md +40 -0
- 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 전달 계약 검증 통과");
|