qfai 1.0.4 → 1.0.6

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 (94) hide show
  1. package/README.md +58 -67
  2. package/assets/init/.qfai/README.md +17 -76
  3. package/assets/init/.qfai/assistant/README.md +9 -0
  4. package/assets/init/.qfai/assistant/agents/README.md +36 -0
  5. package/assets/init/.qfai/assistant/agents/architect.md +73 -0
  6. package/assets/init/.qfai/assistant/agents/backend-engineer.md +73 -0
  7. package/assets/init/.qfai/assistant/agents/code-reviewer.md +73 -0
  8. package/assets/init/.qfai/assistant/agents/contract-designer.md +73 -0
  9. package/assets/init/.qfai/assistant/agents/devops-ci-engineer.md +73 -0
  10. package/assets/init/.qfai/assistant/agents/facilitator.md +74 -0
  11. package/assets/init/.qfai/assistant/agents/frontend-engineer.md +73 -0
  12. package/assets/init/.qfai/assistant/agents/interviewer.md +72 -0
  13. package/assets/init/.qfai/assistant/agents/planner.md +73 -0
  14. package/assets/init/.qfai/assistant/agents/qa-engineer.md +73 -0
  15. package/assets/init/.qfai/assistant/agents/requirements-analyst.md +73 -0
  16. package/assets/init/.qfai/assistant/agents/test-engineer.md +73 -0
  17. package/assets/init/.qfai/assistant/instructions/README.md +10 -0
  18. package/assets/init/.qfai/assistant/instructions/agent-selection.md +28 -0
  19. package/assets/init/.qfai/assistant/instructions/communication.md +27 -0
  20. package/assets/init/.qfai/assistant/instructions/constitution.md +131 -0
  21. package/assets/init/.qfai/assistant/instructions/quality.md +27 -0
  22. package/assets/init/.qfai/assistant/instructions/thinking.md +29 -0
  23. package/assets/init/.qfai/assistant/instructions/workflow.md +75 -0
  24. package/assets/init/.qfai/assistant/prompts/README.md +19 -0
  25. package/assets/init/.qfai/assistant/prompts/qfai-discuss.md +173 -0
  26. package/assets/init/.qfai/assistant/prompts/qfai-implement.md +230 -0
  27. package/assets/init/.qfai/assistant/prompts/qfai-pr.md +209 -0
  28. package/assets/init/.qfai/assistant/prompts/qfai-require.md +264 -0
  29. package/assets/init/.qfai/assistant/prompts/qfai-scenario-test.md +220 -0
  30. package/assets/init/.qfai/assistant/prompts/qfai-spec.md +291 -0
  31. package/assets/init/.qfai/assistant/prompts/qfai-unit-test.md +193 -0
  32. package/assets/init/.qfai/assistant/prompts/qfai-verify.md +222 -0
  33. package/assets/init/.qfai/assistant/prompts.local/README.md +8 -0
  34. package/assets/init/.qfai/assistant/steering/README.md +40 -0
  35. package/assets/init/.qfai/assistant/steering/product.md +32 -0
  36. package/assets/init/.qfai/assistant/steering/structure.md +34 -0
  37. package/assets/init/.qfai/assistant/steering/tech.md +37 -0
  38. package/assets/init/.qfai/contracts/README.md +7 -87
  39. package/assets/init/.qfai/contracts/api/README.md +8 -0
  40. package/assets/init/.qfai/contracts/db/README.md +25 -0
  41. package/assets/init/.qfai/contracts/ui/README.md +8 -0
  42. package/assets/init/.qfai/report/README.md +13 -0
  43. package/assets/init/.qfai/require/README.md +4 -26
  44. package/assets/init/.qfai/require/require.md +74 -0
  45. package/assets/init/.qfai/specs/README.md +7 -55
  46. package/assets/init/root/.github/workflows/qfai.yml +1 -1
  47. package/assets/init/root/qfai.config.yaml +3 -3
  48. package/dist/cli/index.cjs +306 -423
  49. package/dist/cli/index.cjs.map +1 -1
  50. package/dist/cli/index.mjs +288 -405
  51. package/dist/cli/index.mjs.map +1 -1
  52. package/dist/index.cjs +29 -14
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.mjs +29 -14
  55. package/dist/index.mjs.map +1 -1
  56. package/package.json +1 -1
  57. package/assets/init/.qfai/contracts/api/api-0001-sample.yaml +0 -15
  58. package/assets/init/.qfai/contracts/db/db-0001-sample.sql +0 -7
  59. package/assets/init/.qfai/contracts/ui/assets/thema-001-facebook-like/assets.yaml +0 -6
  60. package/assets/init/.qfai/contracts/ui/assets/thema-001-facebook-like/palette.png +0 -0
  61. package/assets/init/.qfai/contracts/ui/assets/ui-0001-sample/assets.yaml +0 -6
  62. package/assets/init/.qfai/contracts/ui/assets/ui-0001-sample/snapshots/login__desktop__light__default.png +0 -0
  63. package/assets/init/.qfai/contracts/ui/thema-001-facebook-like.yml +0 -13
  64. package/assets/init/.qfai/contracts/ui/ui-0001-sample.yaml +0 -17
  65. package/assets/init/.qfai/out/README.md +0 -17
  66. package/assets/init/.qfai/promptpack/commands/implement.md +0 -8
  67. package/assets/init/.qfai/promptpack/commands/plan.md +0 -11
  68. package/assets/init/.qfai/promptpack/commands/release.md +0 -6
  69. package/assets/init/.qfai/promptpack/commands/review.md +0 -6
  70. package/assets/init/.qfai/promptpack/constitution.md +0 -15
  71. package/assets/init/.qfai/promptpack/roles/qa.md +0 -4
  72. package/assets/init/.qfai/promptpack/roles/spec.md +0 -4
  73. package/assets/init/.qfai/promptpack/roles/test.md +0 -4
  74. package/assets/init/.qfai/promptpack/steering/naming.md +0 -7
  75. package/assets/init/.qfai/promptpack/steering/traceability.md +0 -25
  76. package/assets/init/.qfai/prompts/README.md +0 -68
  77. package/assets/init/.qfai/prompts/analyze/README.md +0 -21
  78. package/assets/init/.qfai/prompts/analyze/scenario_test_consistency.md +0 -8
  79. package/assets/init/.qfai/prompts/analyze/scenario_to_test.md +0 -56
  80. package/assets/init/.qfai/prompts/analyze/spec_contract_consistency.md +0 -8
  81. package/assets/init/.qfai/prompts/analyze/spec_scenario_consistency.md +0 -8
  82. package/assets/init/.qfai/prompts/analyze/spec_to_contract.md +0 -54
  83. package/assets/init/.qfai/prompts/analyze/spec_to_scenario.md +0 -56
  84. package/assets/init/.qfai/prompts/makeBusinessFlow.md +0 -34
  85. package/assets/init/.qfai/prompts/makeOverview.md +0 -27
  86. package/assets/init/.qfai/prompts/qfai-generate-test-globs.md +0 -29
  87. package/assets/init/.qfai/prompts/qfai-maintain-contracts.md +0 -35
  88. package/assets/init/.qfai/prompts/qfai-maintain-traceability.md +0 -36
  89. package/assets/init/.qfai/prompts/require-to-spec.md +0 -40
  90. package/assets/init/.qfai/prompts.local/README.md +0 -31
  91. package/assets/init/.qfai/specs/spec-0001/delta.md +0 -25
  92. package/assets/init/.qfai/specs/spec-0001/scenario.feature +0 -11
  93. package/assets/init/.qfai/specs/spec-0001/spec.md +0 -40
  94. package/assets/init/root/tests/qfai-traceability.sample.test.ts +0 -2
package/dist/index.cjs CHANGED
@@ -63,8 +63,8 @@ var defaultConfig = {
63
63
  paths: {
64
64
  contractsDir: ".qfai/contracts",
65
65
  specsDir: ".qfai/specs",
66
- outDir: ".qfai/out",
67
- promptsDir: ".qfai/prompts",
66
+ outDir: ".qfai/report",
67
+ promptsDir: ".qfai/assistant/prompts",
68
68
  srcDir: "src",
69
69
  testsDir: "tests"
70
70
  },
@@ -92,7 +92,7 @@ var defaultConfig = {
92
92
  }
93
93
  },
94
94
  output: {
95
- validateJsonPath: ".qfai/out/validate.json"
95
+ validateJsonPath: ".qfai/report/validate.json"
96
96
  }
97
97
  };
98
98
  function getConfigPath(root) {
@@ -1290,8 +1290,8 @@ var import_promises7 = require("fs/promises");
1290
1290
  var import_node_path8 = __toESM(require("path"), 1);
1291
1291
  var import_node_url = require("url");
1292
1292
  async function resolveToolVersion() {
1293
- if ("1.0.4".length > 0) {
1294
- return "1.0.4";
1293
+ if ("1.0.6".length > 0) {
1294
+ return "1.0.6";
1295
1295
  }
1296
1296
  try {
1297
1297
  const packagePath = resolvePackageJsonPath();
@@ -2226,11 +2226,24 @@ function getInitAssetsDir() {
2226
2226
 
2227
2227
  // src/core/promptsIntegrity.ts
2228
2228
  var LEGACY_OK_EXTRA = /* @__PURE__ */ new Set(["qfai-classify-change.md"]);
2229
- async function diffProjectPromptsAgainstInitAssets(root) {
2230
- const promptsDir = import_node_path14.default.resolve(root, ".qfai", "prompts");
2229
+ async function diffProjectPromptsAgainstInitAssets(root, config) {
2230
+ const promptsDirConfig = config.paths.promptsDir;
2231
+ const promptsDir = import_node_path14.default.isAbsolute(promptsDirConfig) ? promptsDirConfig : import_node_path14.default.resolve(root, promptsDirConfig);
2231
2232
  let templateDir;
2232
2233
  try {
2233
- templateDir = import_node_path14.default.join(getInitAssetsDir(), ".qfai", "prompts");
2234
+ const rel = import_node_path14.default.isAbsolute(promptsDirConfig) ? import_node_path14.default.relative(root, promptsDirConfig) : promptsDirConfig;
2235
+ const normalized = rel.replace(/^[\\/]+/, "");
2236
+ if (normalized.length === 0 || normalized.startsWith("..")) {
2237
+ return {
2238
+ status: "skipped_missing_assets",
2239
+ promptsDir,
2240
+ templateDir: "",
2241
+ missing: [],
2242
+ extra: [],
2243
+ changed: []
2244
+ };
2245
+ }
2246
+ templateDir = import_node_path14.default.join(getInitAssetsDir(), normalized);
2234
2247
  } catch {
2235
2248
  return {
2236
2249
  status: "skipped_missing_assets",
@@ -2322,8 +2335,8 @@ function intersectKeys(a, b) {
2322
2335
  }
2323
2336
 
2324
2337
  // src/core/validators/promptsIntegrity.ts
2325
- async function validatePromptsIntegrity(root) {
2326
- const diff = await diffProjectPromptsAgainstInitAssets(root);
2338
+ async function validatePromptsIntegrity(root, config) {
2339
+ const diff = await diffProjectPromptsAgainstInitAssets(root, config);
2327
2340
  if (diff.status !== "modified") {
2328
2341
  return [];
2329
2342
  }
@@ -2340,11 +2353,11 @@ async function validatePromptsIntegrity(root) {
2340
2353
  code: "QFAI-PROMPTS-001",
2341
2354
  severity: "error",
2342
2355
  category: "change",
2343
- message: `\u6A19\u6E96\u8CC7\u7523 '.qfai/prompts/**' \u304C\u6539\u5909\u3055\u308C\u3066\u3044\u307E\u3059\uFF08${hints || `\u5DEE\u5206=${total}`}\uFF09\u3002${sampleText}`,
2356
+ message: `\u6A19\u6E96\u8CC7\u7523 '.qfai/assistant/prompts/**' \u304C\u6539\u5909\u3055\u308C\u3066\u3044\u307E\u3059\uFF08${hints || `\u5DEE\u5206=${total}`}\uFF09\u3002${sampleText}`,
2344
2357
  suggested_action: [
2345
2358
  "prompts \u306E\u76F4\u7DE8\u96C6\u306F\u975E\u63A8\u5968\u3067\u3059\uFF08\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8/\u518D init \u3067\u4E0A\u66F8\u304D\u3055\u308C\u5F97\u307E\u3059\uFF09\u3002",
2346
2359
  "\u6B21\u306E\u3044\u305A\u308C\u304B\u3092\u5B9F\u65BD\u3057\u3066\u304F\u3060\u3055\u3044:",
2347
- "- \u5909\u66F4\u3057\u305F\u3044\u5834\u5408: \u540C\u4E00\u76F8\u5BFE\u30D1\u30B9\u3067 '.qfai/prompts.local/**' \u306B\u7F6E\u3044\u3066 overlay",
2360
+ "- \u5909\u66F4\u3057\u305F\u3044\u5834\u5408: \u540C\u4E00\u76F8\u5BFE\u30D1\u30B9\u3067 '.qfai/assistant/prompts.local/**' \u306B\u7F6E\u3044\u3066 overlay",
2348
2361
  "- \u6A19\u6E96\u72B6\u614B\u3078\u623B\u3059\u5834\u5408: 'qfai init --force' \u3092\u5B9F\u884C\uFF08prompts \u306E\u307F\u4E0A\u66F8\u304D\u3001prompts.local \u306F\u4FDD\u8B77\uFF09"
2349
2362
  ].join("\n"),
2350
2363
  rule: "prompts.integrity"
@@ -3215,7 +3228,7 @@ async function validateProject(root, configResult) {
3215
3228
  const { config, issues: configIssues } = resolved;
3216
3229
  const issues = [
3217
3230
  ...configIssues,
3218
- ...await validatePromptsIntegrity(root),
3231
+ ...await validatePromptsIntegrity(root, config),
3219
3232
  ...await validateSpecs(root, config),
3220
3233
  ...await validateDeltas(root, config),
3221
3234
  ...await validateScenarios(root, config),
@@ -3738,7 +3751,9 @@ function formatReportMarkdown(data, options = {}) {
3738
3751
  );
3739
3752
  }
3740
3753
  lines.push("- \u5909\u66F4\u5185\u5BB9\u30FB\u53D7\u5165\u89B3\u70B9\u306F `.qfai/specs/*/delta.md` \u306B\u8A18\u9332\u3057\u307E\u3059\u3002");
3741
- lines.push("- \u53C2\u7167\u30EB\u30FC\u30EB\u306E\u6B63\u672C: `.qfai/promptpack/steering/traceability.md`");
3754
+ lines.push(
3755
+ "- \u53C2\u7167\u30EB\u30FC\u30EB\u306E\u6B63\u672C: `.qfai/assistant/instructions/constitution.md`"
3756
+ );
3742
3757
  return lines.join("\n");
3743
3758
  }
3744
3759
  function formatReportJson(data) {