@dommaker/harness 0.14.0 → 0.16.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 (118) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cli/commands/knowledge.js +6 -6
  3. package/dist/cli/commands/knowledge.js.map +1 -1
  4. package/dist/cli/commands/release.d.ts.map +1 -1
  5. package/dist/cli/commands/release.js +43 -6
  6. package/dist/cli/commands/release.js.map +1 -1
  7. package/dist/core/constraints/checker.js +1 -1
  8. package/dist/core/constraints/checker.js.map +1 -1
  9. package/dist/core/constraints/definitions.d.ts.map +1 -1
  10. package/dist/core/constraints/definitions.js +30 -24
  11. package/dist/core/constraints/definitions.js.map +1 -1
  12. package/dist/knowledge/audit.d.ts.map +1 -1
  13. package/dist/knowledge/audit.js +1 -1
  14. package/dist/knowledge/audit.js.map +1 -1
  15. package/dist/knowledge/doctor.d.ts +1 -1
  16. package/dist/knowledge/doctor.d.ts.map +1 -1
  17. package/dist/knowledge/import.d.ts +1 -1
  18. package/dist/knowledge/import.d.ts.map +1 -1
  19. package/dist/knowledge/index.d.ts +2 -1
  20. package/dist/knowledge/index.d.ts.map +1 -1
  21. package/dist/knowledge/index.js +2 -2
  22. package/dist/knowledge/index.js.map +1 -1
  23. package/dist/knowledge/ingest.d.ts +1 -1
  24. package/dist/knowledge/ingest.d.ts.map +1 -1
  25. package/dist/knowledge/lifecycle-hooks.d.ts +1 -1
  26. package/dist/knowledge/lifecycle-hooks.d.ts.map +1 -1
  27. package/dist/knowledge/lifecycle.d.ts +1 -1
  28. package/dist/knowledge/lifecycle.d.ts.map +1 -1
  29. package/dist/knowledge/lint.d.ts +1 -1
  30. package/dist/knowledge/lint.d.ts.map +1 -1
  31. package/dist/knowledge/lint.js +1 -1
  32. package/dist/knowledge/lint.js.map +1 -1
  33. package/dist/knowledge/query.d.ts +1 -1
  34. package/dist/knowledge/query.d.ts.map +1 -1
  35. package/dist/knowledge/reference-tracker.d.ts +1 -1
  36. package/dist/knowledge/reference-tracker.d.ts.map +1 -1
  37. package/dist/knowledge/store.d.ts +29 -2
  38. package/dist/knowledge/store.d.ts.map +1 -1
  39. package/dist/knowledge/store.js +10 -5
  40. package/dist/knowledge/store.js.map +1 -1
  41. package/dist/knowledge/types.d.ts +14 -0
  42. package/dist/knowledge/types.d.ts.map +1 -1
  43. package/dist/monitoring/knowledge-evolver.d.ts +1 -1
  44. package/dist/monitoring/knowledge-evolver.d.ts.map +1 -1
  45. package/dist/types/constraint.d.ts +1 -1
  46. package/dist/types/constraint.d.ts.map +1 -1
  47. package/package.json +1 -1
  48. package/src/__tests__/checker.test.ts +4 -4
  49. package/src/cli/commands/__tests__/knowledge.test.ts +1 -1
  50. package/src/cli/commands/knowledge.ts +1 -1
  51. package/src/cli/commands/release.ts +44 -6
  52. package/src/context/__tests__/knowledge-injector.test.ts +1 -1
  53. package/src/core/constraints/checker.ts +1 -1
  54. package/src/core/constraints/definitions.ts +31 -25
  55. package/src/knowledge/__tests__/audit.test.ts +1 -1
  56. package/src/knowledge/__tests__/doctor.test.ts +1 -1
  57. package/src/knowledge/__tests__/import.test.ts +1 -1
  58. package/src/knowledge/__tests__/ingest.test.ts +1 -1
  59. package/src/knowledge/__tests__/lifecycle-hooks.test.ts +1 -1
  60. package/src/knowledge/__tests__/lifecycle.test.ts +1 -1
  61. package/src/knowledge/__tests__/lint.test.ts +1 -1
  62. package/src/knowledge/__tests__/query.test.ts +1 -1
  63. package/src/knowledge/__tests__/reference-tracker.test.ts +1 -1
  64. package/src/knowledge/__tests__/store.test.ts +1 -1
  65. package/src/knowledge/audit.ts +3 -2
  66. package/src/knowledge/doctor.ts +1 -1
  67. package/src/knowledge/import.ts +1 -1
  68. package/src/knowledge/index.ts +2 -1
  69. package/src/knowledge/ingest.ts +1 -1
  70. package/src/knowledge/lifecycle-hooks.ts +1 -1
  71. package/src/knowledge/lifecycle.ts +1 -1
  72. package/src/knowledge/lint.ts +2 -2
  73. package/src/knowledge/query.ts +1 -1
  74. package/src/knowledge/reference-tracker.ts +1 -1
  75. package/src/knowledge/store.ts +27 -4
  76. package/src/knowledge/types.ts +17 -0
  77. package/src/monitoring/knowledge-evolver.ts +1 -1
  78. package/src/types/constraint.ts +1 -1
  79. package/dist/cli/commands/diagnose.d.ts +0 -16
  80. package/dist/cli/commands/diagnose.d.ts.map +0 -1
  81. package/dist/cli/commands/diagnose.js +0 -195
  82. package/dist/cli/commands/diagnose.js.map +0 -1
  83. package/dist/cli/commands/propose.d.ts +0 -18
  84. package/dist/cli/commands/propose.d.ts.map +0 -1
  85. package/dist/cli/commands/propose.js +0 -331
  86. package/dist/cli/commands/propose.js.map +0 -1
  87. package/dist/cli/commands/traces.d.ts +0 -15
  88. package/dist/cli/commands/traces.d.ts.map +0 -1
  89. package/dist/cli/commands/traces.js +0 -167
  90. package/dist/cli/commands/traces.js.map +0 -1
  91. package/dist/constraints/definitions.d.ts +0 -39
  92. package/dist/constraints/definitions.d.ts.map +0 -1
  93. package/dist/constraints/definitions.js +0 -71
  94. package/dist/constraints/definitions.js.map +0 -1
  95. package/dist/constraints/quality.d.ts +0 -11
  96. package/dist/constraints/quality.d.ts.map +0 -1
  97. package/dist/constraints/quality.js +0 -257
  98. package/dist/constraints/quality.js.map +0 -1
  99. package/dist/constraints/safety.d.ts +0 -13
  100. package/dist/constraints/safety.d.ts.map +0 -1
  101. package/dist/constraints/safety.js +0 -103
  102. package/dist/constraints/safety.js.map +0 -1
  103. package/dist/extensions/long-running/constraints.d.ts +0 -38
  104. package/dist/extensions/long-running/constraints.d.ts.map +0 -1
  105. package/dist/extensions/long-running/constraints.js +0 -153
  106. package/dist/extensions/long-running/constraints.js.map +0 -1
  107. package/dist/extensions/long-running/index.d.ts +0 -30
  108. package/dist/extensions/long-running/index.d.ts.map +0 -1
  109. package/dist/extensions/long-running/index.js +0 -50
  110. package/dist/extensions/long-running/index.js.map +0 -1
  111. package/dist/extensions/long-running/types.d.ts +0 -154
  112. package/dist/extensions/long-running/types.d.ts.map +0 -1
  113. package/dist/extensions/long-running/types.js +0 -9
  114. package/dist/extensions/long-running/types.js.map +0 -1
  115. package/dist/presets/long-running.d.ts +0 -33
  116. package/dist/presets/long-running.d.ts.map +0 -1
  117. package/dist/presets/long-running.js +0 -52
  118. package/dist/presets/long-running.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"constraint.d.ts","sourceRoot":"","sources":["../../src/types/constraint.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,WAAW,GAAG,KAAK,CAAC;AAE/D;;GAEG;AACH;;;;;;;;GAQG;AAEH,eAAO,MAAM,mBAAmB,EAAG,qBAA8B,CAAC;AAClE,eAAO,MAAM,iBAAiB,EAAG,mBAA4B,CAAC;AAC9D,eAAO,MAAM,aAAa,EAAG,eAAwB,CAAC;AACtD,eAAO,MAAM,aAAa,EAAG,eAAwB,CAAC;AACtD,eAAO,MAAM,eAAe,EAAG,iBAA0B,CAAC;AAC1D,eAAO,MAAM,mBAAmB,EAAG,qBAA8B,CAAC;AAClE,eAAO,MAAM,eAAe,EAAG,iBAA0B,CAAC;AAC1D,eAAO,MAAM,gBAAgB,EAAG,kBAA2B,CAAC;AAC5D,eAAO,MAAM,UAAU,EAAG,YAAqB,CAAC;AAChD,eAAO,MAAM,aAAa,EAAG,eAAwB,CAAC;AACtD,eAAO,MAAM,aAAa,EAAG,eAAwB,CAAC;AACtD,eAAO,MAAM,MAAM,EAAG,QAAiB,CAAC;AACxC,eAAO,MAAM,IAAI,EAAG,MAAe,CAAC;AACpC,eAAO,MAAM,KAAK,EAAG,OAAgB,CAAC;AACtC,eAAO,MAAM,cAAc,EAAG,gBAAyB,CAAC;AACxD,eAAO,MAAM,mBAAmB,EAAG,qBAA8B,CAAC;AAElE,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY;IACZ,EAAE,EAAE,YAAY,CAAC;IAEjB,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IAEb,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW;IACX,KAAK,EAAE,eAAe,CAAC;IAEvB,yBAAyB;IACzB,OAAO,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,CAAC;IAEjD,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAC;IAEpB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,WAAW;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAMD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,YAAY,CAAC;AAErC;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY;IACZ,EAAE,EAAE,YAAY,CAAC;IAEjB,WAAW;IACX,KAAK,EAAE,eAAe,CAAC;IAEvB,WAAW;IACX,SAAS,EAAE,OAAO,CAAC;IAEnB,WAAW;IACX,UAAU,CAAC,EAAE,UAAU,CAAC;IAExB,SAAS;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,WAAW;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,WAAW;IACX,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,kBAAkB;IAClB,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,aAAa;IACb,SAAS,EAAE,iBAAiB,CAAC;IAE7B,aAAa;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,WAAW;IACX,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,cAAc;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,WAAW;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAMhB,gBAAgB;IAChB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC,4BAA4B;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,cAAc;IACd,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,YAAY;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,eAAe;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,gBAAgB;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,aAAa;IACb,gBAAgB,CAAC,EAAE;QACjB,oBAAoB,EAAE,MAAM,EAAE,CAAC;QAC/B,QAAQ,EAAE,OAAO,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IAEF,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,+CAA+C;IAC/C,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAE5C,iEAAiE;IACjE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B,wDAAwD;IACxD,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,iCAAiC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAO5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAG9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAG1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAGjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAG5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAGpC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAG9B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAG3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B,aAAa;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,YAAY;IACZ,gBAAgB,CAAC,EAAE,GAAG,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAE/C;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,SAAgB,MAAM,EAAE,gBAAgB,CAAC;gBAE7B,MAAM,EAAE,gBAAgB;CAKrC;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,wBAAwB;gBACrD,MAAM,EAAE,gBAAgB;CAIrC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,qBAAqB;IACrB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAE7B,uBAAuB;IACvB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAE/B,kBAAkB;IAClB,IAAI,EAAE,gBAAgB,EAAE,CAAC;IAEzB,mBAAmB;IACnB,MAAM,EAAE,OAAO,CAAC;IAEhB,WAAW;IACX,YAAY,EAAE,MAAM,CAAC;IAErB,WAAW;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB"}
1
+ {"version":3,"file":"constraint.d.ts","sourceRoot":"","sources":["../../src/types/constraint.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dommaker/harness",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "description": "通用工程约束框架 - 铁律系统、检查点验证、测试门控、拦截器",
5
5
  "keywords": [
6
6
  "harness",
@@ -1113,19 +1113,19 @@ describe('ConstraintChecker', () => {
1113
1113
  expect(result.satisfied).toBe(false);
1114
1114
  });
1115
1115
 
1116
- it('must_use_worktree should pass with worktree', async () => {
1116
+ it('prefer_worktree should pass with worktree', async () => {
1117
1117
  const context: ConstraintContext = { operation: 'code_implementation', hasWorktree: true };
1118
1118
  const result = await checker.check(
1119
- { id: 'must_use_worktree', level: 'iron_law', rule: 'WORKTREE', message: 'test', trigger: 'code_implementation', enforcement: 'test' },
1119
+ { id: 'prefer_worktree', level: 'guideline', rule: 'WORKTREE', message: 'test', trigger: 'code_implementation', enforcement: 'test' },
1120
1120
  context
1121
1121
  );
1122
1122
  expect(result.satisfied).toBe(true);
1123
1123
  });
1124
1124
 
1125
- it('must_use_worktree should fail without worktree', async () => {
1125
+ it('prefer_worktree should fail without worktree', async () => {
1126
1126
  const context: ConstraintContext = { operation: 'code_implementation', hasWorktree: false };
1127
1127
  const result = await checker.check(
1128
- { id: 'must_use_worktree', level: 'iron_law', rule: 'WORKTREE', message: 'test', trigger: 'code_implementation', enforcement: 'test' },
1128
+ { id: 'prefer_worktree', level: 'guideline', rule: 'WORKTREE', message: 'test', trigger: 'code_implementation', enforcement: 'test' },
1129
1129
  context
1130
1130
  );
1131
1131
  expect(result.satisfied).toBe(false);
@@ -68,7 +68,7 @@ describe('getKnowledgeDir', () => {
68
68
 
69
69
  beforeEach(() => {
70
70
  delete process.env.KNOWLEDGE_BASE_DIR;
71
- storeCtorSpy = jest.spyOn(storeModule, 'KnowledgeStore').mockImplementation(() => ({
71
+ storeCtorSpy = jest.spyOn(storeModule, 'FileKnowledgeStore').mockImplementation(() => ({
72
72
  list: jest.fn().mockReturnValue([]),
73
73
  }));
74
74
  });
@@ -8,7 +8,7 @@ import chalk from 'chalk';
8
8
  import * as fs from 'fs';
9
9
  import * as os from 'os';
10
10
  import * as path from 'path';
11
- import { KnowledgeStore } from '../../knowledge/store';
11
+ import { FileKnowledgeStore as KnowledgeStore } from '../../knowledge/store';
12
12
  import { KnowledgeQuery } from '../../knowledge/query';
13
13
  import { KnowledgeLifecycle } from '../../knowledge/lifecycle';
14
14
  import { ColdStartImporter } from '../../knowledge/import';
@@ -44,7 +44,26 @@ export async function release(options: ReleaseOptions): Promise<void> {
44
44
  console.log(chalk.cyan(`📦 ${pkgName}@${oldVersion}`));
45
45
  console.log(chalk.cyan(` bump: ${bumpType}${dryRun ? ' (dry-run)' : ''}`));
46
46
 
47
- // ── 2. Check clean working tree ──
47
+ // ── 2. Check branch (must be on master/main) ──
48
+ const branchResult = await run('git rev-parse --abbrev-ref HEAD', pkgPath);
49
+ const currentBranch = branchResult.stdout.trim();
50
+ if (currentBranch !== 'master' && currentBranch !== 'main') {
51
+ console.error(chalk.red(`❌ Must be on master or main branch to release. Currently on: ${currentBranch}`));
52
+ console.error(chalk.gray(' Run: git checkout master && git merge ' + currentBranch));
53
+ process.exit(1);
54
+ }
55
+ console.log(chalk.green(`✅ git: on ${currentBranch}`));
56
+
57
+ // ── 2b. Check remote sync ──
58
+ await run('git fetch origin', pkgPath, 15_000);
59
+ const behind = await run(`git rev-list --count HEAD..origin/${currentBranch}`, pkgPath);
60
+ if (behind.stdout.trim() !== '0') {
61
+ console.error(chalk.red(`❌ Local ${currentBranch} is ${behind.stdout.trim()} commits behind origin/${currentBranch}. Pull first.`));
62
+ process.exit(1);
63
+ }
64
+ console.log(chalk.green('✅ git: synced with remote'));
65
+
66
+ // ── 2c. Check clean working tree ──
48
67
  const stat = await run('git status --porcelain -uno', pkgPath);
49
68
  if (stat.stdout.length > 0) {
50
69
  console.error(chalk.red('❌ Uncommitted changes. Commit or stash before releasing.'));
@@ -98,6 +117,18 @@ export async function release(options: ReleaseOptions): Promise<void> {
98
117
  // ── 5. Bump version (npm version creates git commit + tag atomically,
99
118
  // including package-lock.json — no desync possible) ──
100
119
  console.log(chalk.cyan('🔢 Bumping version...'));
120
+ const [major, minor, patch] = oldVersion.split('.').map(Number);
121
+ let expectedNew: string;
122
+ if (bumpType === 'major') expectedNew = `${major + 1}.0.0`;
123
+ else if (bumpType === 'minor') expectedNew = `${major}.${minor + 1}.0`;
124
+ else expectedNew = `${major}.${minor}.${patch + 1}`;
125
+ const expectedTag = `v${expectedNew}`;
126
+ const tagExists = await run(`git tag -l "${expectedTag}"`, pkgPath);
127
+ if (tagExists.stdout.trim() === expectedTag) {
128
+ console.error(chalk.red(`❌ Tag ${expectedTag} already exists. Version may have been released already.`));
129
+ process.exit(1);
130
+ }
131
+
101
132
  const bump = await run(`npm version ${bumpType} -m "release: %s"`, pkgPath);
102
133
  if (bump.stderr && !bump.stdout) {
103
134
  console.error(chalk.red('❌ npm version failed:'), bump.stderr);
@@ -107,10 +138,9 @@ export async function release(options: ReleaseOptions): Promise<void> {
107
138
  const tag = `v${newVersion}`;
108
139
  console.log(chalk.green(`✅ version: ${oldVersion} → ${newVersion} (committed + tagged)`));
109
140
 
110
- // ── 7. Push ──
141
+ // ── 6. Push ──
111
142
  console.log(chalk.cyan('⬆️ Pushing...'));
112
- const branch = await run('git rev-parse --abbrev-ref HEAD', pkgPath);
113
- const push = await run(`git push origin ${branch.stdout}`, pkgPath, 30_000);
143
+ const push = await run(`git push origin ${currentBranch}`, pkgPath, 30_000);
114
144
  if (push.stderr && push.stderr.includes('error')) {
115
145
  console.error(chalk.red('❌ git push failed:'), push.stderr.slice(0, 500));
116
146
  process.exit(1);
@@ -118,7 +148,15 @@ export async function release(options: ReleaseOptions): Promise<void> {
118
148
  await run(`git push origin ${tag}`, pkgPath, 30_000);
119
149
  console.log(chalk.green('✅ git: pushed'));
120
150
 
121
- // ── 8. npm publish ──
151
+ // ── 8. Check private flag ──
152
+ if (pkgJson.private) {
153
+ console.error(chalk.red('❌ package.json has "private": true. Remove it before publishing.'));
154
+ console.error(chalk.gray(' The release tool will NOT auto-remove private flag.'));
155
+ process.exit(1);
156
+ }
157
+ console.log(chalk.green('✅ package: not private'));
158
+
159
+ // ── 7. npm publish ──
122
160
  // Switch to npmjs.org for publishing (npmmirror is read-only mirror)
123
161
  const origRegistry = await run('npm config get registry', pkgPath);
124
162
  await run('npm config set registry https://registry.npmjs.org/', pkgPath);
@@ -136,7 +174,7 @@ export async function release(options: ReleaseOptions): Promise<void> {
136
174
  process.exit(1);
137
175
  }
138
176
 
139
- // ── 9. GitHub Release ──
177
+ // ── 8. GitHub Release ──
140
178
  console.log(chalk.cyan('🐙 Creating GitHub Release...'));
141
179
  const gh = await run(`gh release create ${tag} --generate-notes`, pkgPath, 30_000);
142
180
  if (gh.stderr && gh.stderr.includes('already exists')) {
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { KnowledgeInjector } from '../knowledge-injector';
6
6
  import { KnowledgeQuery } from '../../knowledge/query';
7
- import { KnowledgeStore } from '../../knowledge/store';
7
+ import { FileKnowledgeStore as KnowledgeStore } from '../../knowledge/store';
8
8
  import * as fs from 'fs';
9
9
  import * as path from 'path';
10
10
  import * as os from 'os';
@@ -256,7 +256,7 @@ export class ConstraintChecker {
256
256
  // 检查是否有需求文档
257
257
  return context.hasRequirement === true;
258
258
 
259
- case 'must_use_worktree':
259
+ case 'prefer_worktree':
260
260
  // 检查是否在 worktree 中执行
261
261
  return context.hasWorktree === true;
262
262
 
@@ -238,31 +238,6 @@ https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agent
238
238
  promptInjection: '开始编写代码前,必须确认:需求来源明确(Spec/Issue/Roadmap/用户指令)、验收标准(AC)已定义、边界情况已明确。不要凭假设或猜测开始实现。',
239
239
  },
240
240
 
241
- /**
242
- * 必须在 worktree 中开发
243
- * 原因:隔离工作区,安全回滚,并行开发
244
- * 来源:Superpowers must_use_worktree
245
- */
246
- must_use_worktree: {
247
- id: 'must_use_worktree',
248
- rule: 'CODE CHANGES MUST BE ISOLATED IN A WORKTREE',
249
- message: '代码开发必须在隔离的 worktree 中进行',
250
- level: 'iron_law',
251
- trigger: ['code_implementation'],
252
- enforcement: 'check-worktree',
253
- description: `所有代码修改必须在隔离的 worktree 中进行,不要在原始仓库目录直接编辑。
254
-
255
- 【原因】
256
- - 隔离风险:worktree 中的改动不会影响主工作区
257
- - 安全回滚:删除 worktree 即可放弃改动
258
- - 并行开发:多个任务可同时在不同 worktree 中进行
259
-
260
- 【禁止】
261
- - 在原始仓库目录直接编辑文件
262
- - 跳过 worktree 创建直接执行 Agent`,
263
- promptInjection: '所有代码修改必须在隔离的 worktree 中进行。不要在原始仓库目录直接编辑文件。worktree 提供了安全回滚和并行开发能力。如果你发现不在 worktree 中,立即停止并要求创建 worktree。',
264
- },
265
-
266
241
  /**
267
242
  * 禁止模糊完成声明
268
243
  * 原因:质量底线,必须有可量化证据
@@ -371,6 +346,37 @@ https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agent
371
346
  // ========================================
372
347
 
373
348
  export const GUIDELINES: Record<string, Constraint> = {
349
+ /**
350
+ * 高风险改动优先使用 worktree
351
+ * 原因:隔离工作区,安全回滚,并行开发
352
+ * 来源:Superpowers prefer_worktree
353
+ */
354
+ prefer_worktree: {
355
+ id: 'prefer_worktree',
356
+ rule: 'USE WORKTREE FOR HIGH-RISK CHANGES',
357
+ message: '高风险改动应在 worktree 中进行',
358
+ level: 'guideline',
359
+ trigger: ['code_implementation'],
360
+ enforcement: 'check-worktree',
361
+ description: `高风险改动应在隔离的 worktree 中进行。
362
+
363
+ 【何时需要 worktree】
364
+ - 新功能开发(新增模块/API)
365
+ - 跨模块改动(>3 文件)
366
+ - 基础设施变更(CI/CD、依赖)
367
+
368
+ 【何时不需要】
369
+ - 配置文件修改
370
+ - 单文件 bug fix
371
+ - 外科手术式修复(typo、missing import)
372
+
373
+ 【原因】
374
+ - 隔离风险:worktree 中的改动不会影响主工作区
375
+ - 安全回滚:删除 worktree 即可放弃改动
376
+ - 并行开发:多个任务可同时在不同 worktree 中进行`,
377
+ promptInjection: '高风险改动(新功能、跨模块、基础设施)应在 worktree 中进行。配置修改、单文件 fix 可直接编辑。',
378
+ },
379
+
374
380
  /**
375
381
  * 禁止无调查修复 bug
376
382
  * 例外:简单 typo、配置错误
@@ -14,7 +14,7 @@ import * as fs from 'fs';
14
14
  import * as path from 'path';
15
15
  import * as os from 'os';
16
16
  import { KnowledgeAudit } from '../audit';
17
- import { KnowledgeStore } from '../store';
17
+ import { FileKnowledgeStore as KnowledgeStore } from '../store';
18
18
  import type { KnowledgeEntry } from '../types';
19
19
 
20
20
  function makeTmpDir(): string {
@@ -4,7 +4,7 @@
4
4
 
5
5
  import * as fs from 'fs';
6
6
  import * as path from 'path';
7
- import { KnowledgeStore } from '../store';
7
+ import { FileKnowledgeStore as KnowledgeStore } from '../store';
8
8
  import { KnowledgeLinter, type LintReport } from '../lint';
9
9
  import { ReferenceTracker } from '../reference-tracker';
10
10
  import { KnowledgeHealthScorer } from '../doctor';
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { ColdStartImporter } from '../import';
6
- import { KnowledgeStore } from '../store';
6
+ import { FileKnowledgeStore as KnowledgeStore } from '../store';
7
7
  import * as fs from 'fs';
8
8
  import * as path from 'path';
9
9
  import * as os from 'os';
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { describe, it, expect, beforeAll, afterAll, beforeEach } from '@jest/globals';
6
- import { KnowledgeStore } from '../store';
6
+ import { FileKnowledgeStore as KnowledgeStore } from '../store';
7
7
  import { KnowledgeIngest } from '../ingest';
8
8
  import * as fs from 'fs';
9
9
  import * as path from 'path';
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { KnowledgeLifecycleHooks } from '../lifecycle-hooks';
6
- import { KnowledgeStore } from '../store';
6
+ import { FileKnowledgeStore as KnowledgeStore } from '../store';
7
7
  import { KnowledgeQuery } from '../query';
8
8
  import * as fs from 'fs';
9
9
  import * as path from 'path';
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { describe, it, expect, beforeAll, afterAll, beforeEach } from '@jest/globals';
6
- import { KnowledgeStore } from '../store';
6
+ import { FileKnowledgeStore as KnowledgeStore } from '../store';
7
7
  import { KnowledgeLifecycle } from '../lifecycle';
8
8
  import type { KnowledgeEntry } from '../types';
9
9
  import * as fs from 'fs';
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { KnowledgeLinter } from '../lint';
6
- import { KnowledgeStore } from '../store';
6
+ import { FileKnowledgeStore as KnowledgeStore } from '../store';
7
7
  import { ReferenceTracker } from '../reference-tracker';
8
8
  import * as fs from 'fs';
9
9
  import * as path from 'path';
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { describe, it, expect, beforeAll, afterAll, beforeEach } from '@jest/globals';
6
- import { KnowledgeStore } from '../store';
6
+ import { FileKnowledgeStore as KnowledgeStore } from '../store';
7
7
  import { KnowledgeQuery } from '../query';
8
8
  import type { KnowledgeEntry, QueryBudget } from '../types';
9
9
  import * as fs from 'fs';
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { describe, it, expect, beforeAll, afterAll, beforeEach } from '@jest/globals';
6
- import { KnowledgeStore } from '../store';
6
+ import { FileKnowledgeStore as KnowledgeStore } from '../store';
7
7
  import { ReferenceTracker } from '../reference-tracker';
8
8
  import type { KnowledgeEntry } from '../types';
9
9
  import * as fs from 'fs';
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { describe, it, expect, beforeAll, afterAll, beforeEach } from '@jest/globals';
6
- import { KnowledgeStore } from '../store';
6
+ import { FileKnowledgeStore as KnowledgeStore } from '../store';
7
7
  import type { KnowledgeEntry } from '../types';
8
8
  import * as fs from 'fs';
9
9
  import * as path from 'path';
@@ -11,7 +11,8 @@
11
11
 
12
12
  import * as fs from 'fs';
13
13
  import * as path from 'path';
14
- import { KnowledgeStore } from './store';
14
+ import { FileKnowledgeStore } from './store';
15
+ import type { KnowledgeStore } from './store';
15
16
  import type { KnowledgeEntry, MaturityLevel } from './types';
16
17
 
17
18
  // ── Types ─────────────────────────────────────────────────
@@ -300,7 +301,7 @@ export class KnowledgeAudit {
300
301
  private promotionBlockDays: number;
301
302
 
302
303
  constructor(options?: AuditOptions) {
303
- this.store = new KnowledgeStore({ baseDir: options?.baseDir });
304
+ this.store = new FileKnowledgeStore({ baseDir: options?.baseDir });
304
305
  this.shortContentThreshold = options?.shortContentThreshold ?? DEFAULT_SHORT_CONTENT_THRESHOLD;
305
306
  this.staleDays = options?.staleDays ?? DEFAULT_STALE_DAYS;
306
307
  this.promotionBlockDays = options?.promotionBlockDays ?? DEFAULT_PROMOTION_BLOCK_DAYS;
@@ -5,7 +5,7 @@
5
5
  * MonitorAgent 周期性调用,低于 60 分触发 Triage 告警。
6
6
  */
7
7
 
8
- import { KnowledgeStore } from './store';
8
+ import type { KnowledgeStore } from './store';
9
9
  import { KnowledgeLinter } from './lint';
10
10
  import type { LintIssue } from './types';
11
11
 
@@ -14,7 +14,7 @@
14
14
  import * as fs from 'fs';
15
15
  import * as path from 'path';
16
16
  import type { KnowledgeEntry, KnowledgeType, MaturityLevel, StorageLayer } from './types';
17
- import { KnowledgeStore } from './store';
17
+ import type { KnowledgeStore } from './store';
18
18
 
19
19
  // ── 导入源 ───────────────────────────────────────────────
20
20
 
@@ -5,7 +5,8 @@
5
5
  */
6
6
 
7
7
  export * from './types';
8
- export { KnowledgeStore } from './store';
8
+ export type { KnowledgeStore } from './store';
9
+ export { FileKnowledgeStore } from './store';
9
10
  export { KnowledgeQuery } from './query';
10
11
  export { KnowledgeLifecycle } from './lifecycle';
11
12
  export type { ConsumptionEvent } from './lifecycle';
@@ -12,7 +12,7 @@ import type {
12
12
  IngestOptions,
13
13
  SourceRef,
14
14
  } from './types';
15
- import { KnowledgeStore } from './store';
15
+ import type { KnowledgeStore } from './store';
16
16
  import { KnowledgeAudit } from './audit';
17
17
 
18
18
  const MAX_SOURCE_REFS = 20;
@@ -7,7 +7,7 @@
7
7
  */
8
8
 
9
9
  import type { KnowledgeEntry, KnowledgeType } from './types';
10
- import { KnowledgeStore } from './store';
10
+ import type { KnowledgeStore } from './store';
11
11
  import { KnowledgeQuery } from './query';
12
12
  import type { ContextSource } from '../context/types';
13
13
 
@@ -12,7 +12,7 @@ import type {
12
12
  DecayConfig,
13
13
  } from './types';
14
14
  import { DEFAULT_DECAY_CONFIG } from './types';
15
- import { KnowledgeStore } from './store';
15
+ import type { KnowledgeStore } from './store';
16
16
 
17
17
  const MAX_REFERENCED_BY = 20;
18
18
  const MIN_CONTENT_FOR_PROVEN = 100;
@@ -10,7 +10,7 @@
10
10
  * - 成熟度衰减
11
11
  */
12
12
 
13
- import { KnowledgeStore } from './store';
13
+ import type { KnowledgeStore } from './store';
14
14
  import { ReferenceTracker } from './reference-tracker';
15
15
  import type { KnowledgeEntry, LintIssue, LintIssueType, MaturityLevel } from './types';
16
16
 
@@ -79,7 +79,7 @@ export class KnowledgeLinter {
79
79
  */
80
80
  checkIndexConsistency(entries: KnowledgeEntry[]): LintIssue[] {
81
81
  const issues: LintIssue[] = [];
82
- const index = this.store['readIndex']();
82
+ const index = this.store.readIndex();
83
83
 
84
84
  // 检查索引中的条目是否都有对应文件
85
85
  for (const indexEntry of index) {
@@ -16,7 +16,7 @@ import type {
16
16
  QueryFilter,
17
17
  IndexEntry,
18
18
  } from './types';
19
- import { KnowledgeStore } from './store';
19
+ import type { KnowledgeStore } from './store';
20
20
  import { KnowledgeLifecycle } from './lifecycle';
21
21
 
22
22
  // ── Constants ──────────────────────────────────────────────
@@ -8,7 +8,7 @@
8
8
  import * as fs from 'fs';
9
9
  import * as path from 'path';
10
10
  import type { ReferenceRecord } from './types';
11
- import { KnowledgeStore } from './store';
11
+ import type { KnowledgeStore } from './store';
12
12
 
13
13
  const REFERENCES_FILE = 'references.jsonl';
14
14
 
@@ -22,7 +22,30 @@ const DEFAULT_CONFIG: StoreConfig = {
22
22
  baseDir: DEFAULT_DIR,
23
23
  };
24
24
 
25
- export class KnowledgeStore {
25
+ /**
26
+ * KnowledgeStore interface — abstract contract for knowledge storage.
27
+ */
28
+ export interface KnowledgeStore {
29
+ getBaseDir(): string;
30
+ get(id: string): KnowledgeEntry | undefined;
31
+ list(filter?: QueryFilter): KnowledgeEntry[];
32
+ save(entry: KnowledgeEntry): void;
33
+ delete(id: string): boolean;
34
+ update(id: string, partial: Partial<KnowledgeEntry>): KnowledgeEntry | undefined;
35
+ rebuildIndex(): void;
36
+ readIndex(): IndexEntry[];
37
+ readEntriesFromDisk(): KnowledgeEntry[];
38
+ snapshot(): string;
39
+ getSnapshot(date: string): IndexEntry[] | undefined;
40
+ getSurvivalRate(daysAgo: number): { rate: number; survived: number; total: number; snapshotDate: string } | undefined;
41
+ }
42
+
43
+ /**
44
+ * FileKnowledgeStore — file-based implementation of KnowledgeStore.
45
+ * Each entry is a markdown file with YAML frontmatter.
46
+ * An index.json provides fast listing without reading all files.
47
+ */
48
+ export class FileKnowledgeStore implements KnowledgeStore {
26
49
  private baseDir: string;
27
50
 
28
51
  constructor(config?: Partial<StoreConfig>) {
@@ -269,7 +292,7 @@ export class KnowledgeStore {
269
292
  * 保存当日 index.json 快照
270
293
  */
271
294
  snapshot(): string {
272
- const snapDir = path.join(this.baseDir, KnowledgeStore.SNAPSHOTS_DIR);
295
+ const snapDir = path.join(this.baseDir, FileKnowledgeStore.SNAPSHOTS_DIR);
273
296
  if (!fs.existsSync(snapDir)) {
274
297
  fs.mkdirSync(snapDir, { recursive: true });
275
298
  }
@@ -286,7 +309,7 @@ export class KnowledgeStore {
286
309
  * 读取指定日期的快照
287
310
  */
288
311
  getSnapshot(date: string): IndexEntry[] | undefined {
289
- const snapPath = path.join(this.baseDir, KnowledgeStore.SNAPSHOTS_DIR, `index-${date}.json`);
312
+ const snapPath = path.join(this.baseDir, FileKnowledgeStore.SNAPSHOTS_DIR, `index-${date}.json`);
290
313
  if (!fs.existsSync(snapPath)) return undefined;
291
314
  try {
292
315
  return JSON.parse(fs.readFileSync(snapPath, 'utf-8')) as IndexEntry[];
@@ -323,7 +346,7 @@ export class KnowledgeStore {
323
346
 
324
347
  // ── Index I/O ────────────────────────────────────────────
325
348
 
326
- private readIndex(): IndexEntry[] {
349
+ readIndex(): IndexEntry[] {
327
350
  const indexPath = path.join(this.baseDir, INDEX_FILE);
328
351
  if (!fs.existsSync(indexPath)) return [];
329
352
  try {
@@ -146,6 +146,23 @@ export const DEFAULT_DECAY_CONFIG: DecayConfig = {
146
146
  autoPromoteSources: [],
147
147
  };
148
148
 
149
+ // ── Decision ────────────────────────────────────────────────
150
+
151
+ export interface DecisionRecord {
152
+ topic: string;
153
+ category: 'architecture' | 'tooling' | 'process' | 'design';
154
+ context: string;
155
+ decision: string;
156
+ alternatives: string[];
157
+ rationale: string;
158
+ consequences: string;
159
+ participants: string[];
160
+ sourceType: string;
161
+ sourceId?: string;
162
+ revisable: boolean;
163
+ revisitCondition?: string;
164
+ }
165
+
149
166
  // ── Reference ───────────────────────────────────────────────
150
167
 
151
168
  export interface ReferenceRecord {
@@ -9,7 +9,7 @@
9
9
 
10
10
  import type { KnowledgeEntry, MaturityLevel } from '../knowledge/types';
11
11
  import type { KnowledgeDiagnosis } from './knowledge-doctor';
12
- import { KnowledgeStore } from '../knowledge/store';
12
+ import type { KnowledgeStore } from '../knowledge/store';
13
13
 
14
14
  // ── 进化提案 ─────────────────────────────────────────────
15
15
 
@@ -220,7 +220,7 @@ export interface ConstraintContext {
220
220
  /** 是否有需求文档(用于 no_implementation_without_requirement) */
221
221
  hasRequirement?: boolean;
222
222
 
223
- /** 是否在 worktree 中执行(用于 must_use_worktree) */
223
+ /** 是否在 worktree 中执行(用于 prefer_worktree) */
224
224
  hasWorktree?: boolean;
225
225
 
226
226
  /** worktree 路径(用于 worktree 相关检查) */
@@ -1,16 +0,0 @@
1
- /**
2
- * Diagnose CLI 命令
3
- *
4
- * 运行诊断分析异常
5
- */
6
- /**
7
- * diagnose 命令
8
- */
9
- export declare function diagnoseCommand(subcommand: string, options: {
10
- hours?: number;
11
- constraintId?: string;
12
- anomalyId?: string;
13
- format?: 'json' | 'text';
14
- save?: boolean;
15
- }): Promise<void>;
16
- //# sourceMappingURL=diagnose.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/diagnose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH;;GAEG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CA6Bf"}