azcodr 2.2.0 → 2.4.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 (78) hide show
  1. package/.agents/scripts/agent_guard.js +63 -0
  2. package/.agents/skills/lets-build/SKILL.md +1 -1
  3. package/.github/workflows/ci.yml +21 -0
  4. package/.github/workflows/publish.yml +7 -0
  5. package/CODE_OF_CONDUCT.md +122 -0
  6. package/CONTRIBUTING.md +85 -0
  7. package/README.md +73 -3
  8. package/SECURITY.md +32 -0
  9. package/data/memory.template +36 -0
  10. package/docs/rules/clean_code.md +13 -0
  11. package/docs/tipping-points.md +37 -0
  12. package/lib/agent-guard-command.d.ts +28 -0
  13. package/lib/agent-guard-command.d.ts.map +1 -0
  14. package/lib/agent-guard-command.js +103 -0
  15. package/lib/agent-guard-command.js.map +1 -0
  16. package/lib/agent-guard-file.d.ts +32 -0
  17. package/lib/agent-guard-file.d.ts.map +1 -0
  18. package/lib/agent-guard-file.js +77 -0
  19. package/lib/agent-guard-file.js.map +1 -0
  20. package/lib/agent-guard-tdd.d.ts +34 -0
  21. package/lib/agent-guard-tdd.d.ts.map +1 -0
  22. package/lib/agent-guard-tdd.js +77 -0
  23. package/lib/agent-guard-tdd.js.map +1 -0
  24. package/lib/agent-guard.d.ts +38 -0
  25. package/lib/agent-guard.d.ts.map +1 -0
  26. package/lib/agent-guard.js +80 -0
  27. package/lib/agent-guard.js.map +1 -0
  28. package/lib/boundaries.d.ts +41 -0
  29. package/lib/boundaries.d.ts.map +1 -0
  30. package/lib/boundaries.js +158 -0
  31. package/lib/boundaries.js.map +1 -0
  32. package/lib/cli-boundaries.d.ts +18 -0
  33. package/lib/cli-boundaries.d.ts.map +1 -0
  34. package/lib/cli-boundaries.js +46 -0
  35. package/lib/cli-boundaries.js.map +1 -0
  36. package/lib/cli-parse.d.ts +5 -0
  37. package/lib/cli-parse.d.ts.map +1 -1
  38. package/lib/cli-parse.js +35 -5
  39. package/lib/cli-parse.js.map +1 -1
  40. package/lib/cli.d.ts +17 -0
  41. package/lib/cli.d.ts.map +1 -1
  42. package/lib/cli.js +47 -5
  43. package/lib/cli.js.map +1 -1
  44. package/lib/guards.d.ts +6 -0
  45. package/lib/guards.d.ts.map +1 -1
  46. package/lib/guards.js +10 -1
  47. package/lib/guards.js.map +1 -1
  48. package/lib/index.d.ts +15 -0
  49. package/lib/index.d.ts.map +1 -1
  50. package/lib/index.js +12 -0
  51. package/lib/index.js.map +1 -1
  52. package/lib/repo.js +4 -4
  53. package/lib/repo.js.map +1 -1
  54. package/lib/scaffold.d.ts +2 -7
  55. package/lib/scaffold.d.ts.map +1 -1
  56. package/lib/scaffold.js +7 -10
  57. package/lib/scaffold.js.map +1 -1
  58. package/lib/validate.d.ts +33 -0
  59. package/lib/validate.d.ts.map +1 -0
  60. package/lib/validate.js +24 -0
  61. package/lib/validate.js.map +1 -0
  62. package/memory.md +24 -0
  63. package/package.json +10 -2
  64. package/scripts/validate/links.js +0 -1
  65. package/scripts/validate/root.js +1 -1
  66. package/src/agent-guard-command.ts +118 -0
  67. package/src/agent-guard-file.ts +107 -0
  68. package/src/agent-guard-tdd.ts +96 -0
  69. package/src/agent-guard.ts +123 -0
  70. package/src/boundaries.ts +198 -0
  71. package/src/cli-boundaries.ts +67 -0
  72. package/src/cli-parse.ts +40 -4
  73. package/src/cli.ts +57 -15
  74. package/src/guards.ts +11 -1
  75. package/src/index.ts +40 -0
  76. package/src/repo.ts +4 -4
  77. package/src/scaffold.ts +7 -10
  78. package/src/validate.ts +47 -0
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH;;GAEG;AACH,OAAO,EACL,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,OAAO,EACP,mBAAmB,EACnB,MAAM,EACN,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,aAAa,EACb,WAAW,EACZ,MAAM,eAAe,CAAC;AAevB,OAAO,cAAc,MAAM,eAAe,CAAC;AAE3C;;GAEG;AACH,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH;;GAEG;AACH,OAAO,EACL,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,OAAO,EACP,mBAAmB,EACnB,MAAM,EACN,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,aAAa,EACb,WAAW,EACZ,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAG/D;;GAEG;AACH,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACd,MAAM,kBAAkB,CAAC;AAU1B;;GAEG;AACH,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAgBzB,OAAO,cAAc,MAAM,eAAe,CAAC;AAE3C;;GAEG;AACH,eAAe,cAAc,CAAC"}
package/lib/repo.js CHANGED
@@ -50,10 +50,10 @@ function commitWithFallbackIdentity(targetDir) {
50
50
  ...options,
51
51
  env: {
52
52
  ...process.env,
53
- GIT_AUTHOR_NAME: 'Subodh Khanal',
54
- GIT_AUTHOR_EMAIL: 'prosubodh@gmail.com',
55
- GIT_COMMITTER_NAME: 'Subodh Khanal',
56
- GIT_COMMITTER_EMAIL: 'prosubodh@gmail.com'
53
+ GIT_AUTHOR_NAME: 'azcodr[bot]',
54
+ GIT_AUTHOR_EMAIL: 'bot@azcodr.internal',
55
+ GIT_COMMITTER_NAME: 'azcodr[bot]',
56
+ GIT_COMMITTER_EMAIL: 'bot@azcodr.internal'
57
57
  }
58
58
  });
59
59
  }
package/lib/repo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"repo.js","sourceRoot":"","sources":["../src/repo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repo.js","sourceRoot":"","sources":["../src/repo.ts"],"names":[],"mappings":"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"}
package/lib/scaffold.d.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  import { ScaffoldError, ERROR_CODES } from './errors.js';
2
2
  import type { ScaffoldErrorCode, ScaffoldErrorShape } from './errors.js';
3
3
  import { runGit } from './git.js';
4
- import { assertInside, isProtectedTarget } from './guards.js';
4
+ import { assertInside, isProtectedTarget, getTemplateDir } from './guards.js';
5
5
  import { ensureSymlink, ensureSymlinkOrPointer, isSameCaseInsensitiveFile } from './links.js';
6
6
  import type { EnsureSymlinkOptions } from './links.js';
7
7
  import { makeScriptsExecutable } from './permissions.js';
8
8
  import { isInsideGitWorkTree, initGit } from './repo.js';
9
9
  import type { InitGitOptions } from './repo.js';
10
+ export { getTemplateDir };
10
11
  /**
11
12
  * Canonical list of template files and directories copied into a new workspace.
12
13
  */
@@ -47,12 +48,6 @@ export interface ValidateTargetOptions {
47
48
  export interface CopyTemplateOptions {
48
49
  dryRun?: boolean;
49
50
  }
50
- /**
51
- * Resolves the root filesystem directory of the azcodr template files.
52
- *
53
- * @returns Absolute filesystem path to the template root directory.
54
- */
55
- export declare function getTemplateDir(): string;
56
51
  /**
57
52
  * Validates the target directory to ensure it is suitable for scaffolding.
58
53
  *
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAW3C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAkCD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,IAAI,CAW3F;AAwFD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,MAAyB,EACtC,OAAO,GAAE,mBAAwB,GAChC,MAAM,EAAE,CAcV;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CActE;AAED,OAAO,EACL,aAAa,EAAE,sBAAsB,EAAE,yBAAyB,EAChE,qBAAqB,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAC3D,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAC5D,CAAC;AAEF,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;AAE5F,wBAKE"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAW3C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAmCD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,IAAI,CAW3F;AA4FD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,MAAyB,EACtC,OAAO,GAAE,mBAAwB,GAChC,MAAM,EAAE,CAcV;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CActE;AAED,OAAO,EACL,aAAa,EAAE,sBAAsB,EAAE,yBAAyB,EAChE,qBAAqB,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAC3D,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAC5D,CAAC;AAEF,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;AAE5F,wBAKE"}
package/lib/scaffold.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import process from 'node:process';
4
- import { fileURLToPath } from 'node:url';
5
4
  import { ScaffoldError, ERROR_CODES } from './errors.js';
6
5
  import { runGit } from './git.js';
7
- import { assertInside, isProtectedTarget } from './guards.js';
6
+ import { assertInside, isProtectedTarget, getTemplateDir } from './guards.js';
8
7
  import { ensureSymlink, ensureSymlinkOrPointer, isSameCaseInsensitiveFile } from './links.js';
9
8
  import { makeScriptsExecutable } from './permissions.js';
10
9
  import { isInsideGitWorkTree, initGit } from './repo.js';
10
+ export { getTemplateDir };
11
11
  /**
12
12
  * Canonical list of template files and directories copied into a new workspace.
13
13
  */
@@ -23,14 +23,6 @@ export const TEMPLATE_ITEMS = [
23
23
  '.editorconfig',
24
24
  'LICENSE'
25
25
  ];
26
- /**
27
- * Resolves the root filesystem directory of the azcodr template files.
28
- *
29
- * @returns Absolute filesystem path to the template root directory.
30
- */
31
- export function getTemplateDir() {
32
- return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
33
- }
34
26
  function rejectTemplateSelf(resolvedTarget, resolvedTemplate) {
35
27
  if (resolvedTarget !== resolvedTemplate)
36
28
  return;
@@ -72,6 +64,11 @@ export function validateTarget(targetDir, options = {}) {
72
64
  rejectNonEmptyTarget(resolvedTarget, force);
73
65
  }
74
66
  function resolveTemplateItem(resolvedTemplate, item) {
67
+ if (item === 'memory.md') {
68
+ const memTpl = path.join(resolvedTemplate, 'data', 'memory.template');
69
+ if (fs.existsSync(memTpl))
70
+ return memTpl;
71
+ }
75
72
  let srcPath = path.join(resolvedTemplate, item);
76
73
  if (item === '.gitignore' && !fs.existsSync(srcPath)) {
77
74
  const npmIgnorePath = path.join(resolvedTemplate, '.npmignore');
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,WAAW;IACX,WAAW;IACX,WAAW;IACX,MAAM;IACN,SAAS;IACT,SAAS;IACT,SAAS;IACT,YAAY;IACZ,eAAe;IACf,SAAS;CACV,CAAC;AA2CF,SAAS,kBAAkB,CAAC,cAAsB,EAAE,gBAAwB;IAC1E,IAAI,cAAc,KAAK,gBAAgB;QAAE,OAAO;IAChD,MAAM,IAAI,aAAa,CACrB,sBAAsB,EACtB,GAAG,WAAW,CAAC,oBAAoB,KAAK,cAAc,EAAE,CACzD,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,cAAsB,EACtB,WAAmB,EACnB,cAAuB;IAEvB,IAAI,cAAc;QAAE,OAAO;IAC3B,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,CAAC;QAAE,OAAO;IAChE,MAAM,IAAI,aAAa,CACrB,uBAAuB,EACvB,GAAG,WAAW,CAAC,qBAAqB,KAAK,cAAc,IAAI;QAC3D,oGAAoG,CACrG,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,cAAsB,EAAE,KAAc;IAClE,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK;QAAE,OAAO;IAC1C,MAAM,IAAI,aAAa,CACrB,oBAAoB,EACpB,GAAG,WAAW,CAAC,kBAAkB,KAAK,OAAO,CAAC,MAAM,iBAAiB,cAAc,KAAK;QACxF,0CAA0C,CAC3C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,UAAiC,EAAE;IACnF,MAAM,EAAE,WAAW,GAAG,cAAc,EAAE,EAAE,KAAK,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1G,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,kBAAkB,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IACrD,qBAAqB,CAAC,cAAc,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM;YAAE,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IACD,oBAAoB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,mBAAmB,CAAC,gBAAwB,EAAE,IAAY;IACjE,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACtE,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAChE,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,OAAO,GAAG,aAAa,CAAC;IAC5D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,cAAsB,EAAE,gBAAwB,EAAE,MAAe;IAC1F,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACjD,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACxC,YAAY,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,QAAQ,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,cAAsB,EAAE,MAAe;IAClE,MAAM,KAAK,GAAgC;QACzC,CAAC,WAAW,EAAE,WAAW,CAAC;QAC1B,CAAC,WAAW,EAAE,WAAW,CAAC;QAC1B,CAAC,WAAW,EAAE,WAAW,CAAC;QAC1B,CAAC,cAAc,EAAE,WAAW,CAAC;QAC7B,CAAC,gBAAgB,EAAE,WAAW,CAAC;KAChC,CAAC;IACF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,KAAK,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,YAAY,QAAQ,OAAO,cAAc,EAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,cAAsB,EAAE,MAAe;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvF,sBAAsB,CAAC;QACrB,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,yBAAyB;QACnC,cAAc,EAAE,cAAc;QAC9B,MAAM;KACP,CAAC,CAAC;IACH,OAAO,CAAC,0DAA0D,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,kBAAkB,CAAC,cAAsB;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC;IAClE,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,yDAAyD;QACtE,OAAO,EAAE;YACP,IAAI,EAAE,aAAa;YACnB,eAAe,EAAE,iBAAiB;YAClC,IAAI,EAAE,0EAA0E;YAChF,QAAQ,EAAE,8BAA8B;SACzC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,cAAsB,EAAE,MAAe;IACvE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1C,IAAI,MAAM;QAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACtD,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACnF,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB,EAAE,MAAe;IAC/D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC1D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,cAAsB,cAAc,EAAE,EACtC,UAA+B,EAAE;IAEjC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9C,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,cAAc,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,UAA2B,EAAE;IACpD,MAAM,EACJ,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,EACzB,KAAK,GAAG,KAAK,EACb,KAAK,GAAG,KAAK,EACb,WAAW,GAAG,cAAc,EAAE,EAC9B,MAAM,GAAG,KAAK,EACf,GAAG,OAAO,CAAC;IACZ,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,cAAc,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,IAAI,cAAc;QAAE,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACvF,CAAC;AAED,OAAO,EACL,aAAa,EAAE,sBAAsB,EAAE,yBAAyB,EAChE,qBAAqB,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAC3D,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAC5D,CAAC;AAIF,eAAe;IACb,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa;IACrD,sBAAsB,EAAE,yBAAyB,EAAE,qBAAqB;IACxE,mBAAmB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM;IACpD,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB;CAC5E,CAAC"}
@@ -0,0 +1,33 @@
1
+ export interface ValidationResult {
2
+ errors: number;
3
+ warnings: number;
4
+ validatedRules: number;
5
+ validatedSkills: number;
6
+ totalLinks: number;
7
+ brokenLinks: string[];
8
+ }
9
+ export interface ValidationReporter {
10
+ pass: (msg: string) => void;
11
+ warn: (msg: string) => void;
12
+ fail: (msg: string) => void;
13
+ log: (msg: string) => void;
14
+ heading: (msg: string) => void;
15
+ }
16
+ /**
17
+ * Validates the agentic architecture and governance files of a workspace.
18
+ *
19
+ * @param workspaceRoot - Path to the workspace directory (defaults to cwd).
20
+ * @param reporter - Optional custom reporter hooks.
21
+ * @returns Object containing error and warning tallies and validation counts.
22
+ */
23
+ export declare function validate(workspaceRoot?: string, reporter?: ValidationReporter): Promise<ValidationResult>;
24
+ /**
25
+ * Creates a silent reporter that suppresses all status reports.
26
+ */
27
+ export declare function createSilentReporter(): ValidationReporter;
28
+ declare const _default: {
29
+ validate: typeof validate;
30
+ createSilentReporter: typeof createSilentReporter;
31
+ };
32
+ export default _default;
33
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,aAAa,GAAE,MAAsB,EACrC,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAK3B;AAID;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,kBAAkB,CAEzD;;;;;AAED,wBAAkD"}
@@ -0,0 +1,24 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath, pathToFileURL } from 'node:url';
3
+ /**
4
+ * Validates the agentic architecture and governance files of a workspace.
5
+ *
6
+ * @param workspaceRoot - Path to the workspace directory (defaults to cwd).
7
+ * @param reporter - Optional custom reporter hooks.
8
+ * @returns Object containing error and warning tallies and validation counts.
9
+ */
10
+ export async function validate(workspaceRoot = process.cwd(), reporter) {
11
+ const baseDir = import.meta.dirname ?? path.dirname(fileURLToPath(import.meta.url));
12
+ const scriptPath = path.resolve(baseDir, '../scripts/validate.js');
13
+ const mod = await import(pathToFileURL(scriptPath).href);
14
+ return mod.runValidation(path.resolve(workspaceRoot), reporter);
15
+ }
16
+ const noop = () => { };
17
+ /**
18
+ * Creates a silent reporter that suppresses all status reports.
19
+ */
20
+ export function createSilentReporter() {
21
+ return { pass: noop, warn: noop, fail: noop, log: noop, heading: noop };
22
+ }
23
+ export default { validate, createSilentReporter };
24
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAmBxD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,gBAAwB,OAAO,CAAC,GAAG,EAAE,EACrC,QAA6B;IAE7B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,IAAI,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,eAAe,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC"}
package/memory.md CHANGED
@@ -32,6 +32,9 @@
32
32
  | [ADR-013](./memory.md#adr-013-native-esm-port-and-jsr-package-publishing) | Native ESM port and JSR package publishing | 2026-10-07 | ACCEPTED | [`devops_ci_cd.md`](./docs/rules/devops_ci_cd.md) |
33
33
  | [ADR-014](./memory.md#adr-014-author-in-typescript-with-tsc-compilation-to-native-esm) | Author in TypeScript with tsc compilation to native ESM | 2026-10-07 | ACCEPTED | [`type_safety.md`](./docs/rules/type_safety.md) |
34
34
  | [ADR-015](./memory.md#adr-015-consolidate-testing-on-jest-with-typescript-test-migration) | Consolidate testing on Jest with TypeScript test migration | 2026-10-08 | ACCEPTED | [`test_driven_development.md`](./docs/rules/test_driven_development.md) |
35
+ | [ADR-016](./memory.md#adr-016-standalone-architectural-validator-agent-runtime-hooks-boundary-engine--empirical-benchmark) | Standalone Architectural Validator, Agent Runtime Hooks, Boundary Engine & Empirical Benchmark | 2026-10-08 | ACCEPTED | [`agentic_configuration.md`](./docs/rules/agentic_configuration.md) |
36
+ | [ADR-017](./memory.md#adr-017-continuous-mutation-and-benchmark-ci-gates-oss-governance-and-reference-example) | Continuous Mutation & Benchmark CI Gates, OSS Governance & Reference Example | 2026-10-08 | ACCEPTED | [`devops_ci_cd.md`](./docs/rules/devops_ci_cd.md) |
37
+ | [ADR-018](./memory.md#adr-018-first-class-architectural-boundary-and-cycle-inspection-cli-subcommand) | First-Class Architectural Boundary and Cycle Inspection CLI Subcommand | 2026-10-08 | ACCEPTED | [`clean_code.md`](./docs/rules/clean_code.md) |
35
38
 
36
39
  ---
37
40
 
@@ -79,6 +82,27 @@
79
82
  - **Consequences:** ✅ Unified, single-tool test runner across developer and CI pipelines. ✅ End-to-end type safety: `tsc --noEmit` verifies all source and 35 test files without error. ✅ Direct source instrumentation: 100.00% line coverage, 100.00% function coverage, and 98.44% branch coverage achieved on authored TypeScript (`src/`) and scripts. ✅ Clean build separation: `npm run build` strictly emits compiled production code in `lib/` without test artifacts. ✅ Zero external runtime dependencies preserved.
80
83
  - **Enforced In:** `package.json`, `tsconfig.json`, `tsconfig.build.json`, `jest.config.js`, `tests/**/*.test.ts`, `src/scaffold.ts`, `lib/scaffold.js`
81
84
 
85
+ #### ADR-016: Standalone Architectural Validator, Agent Runtime Hooks, Boundary Engine & Empirical Benchmark
86
+ - **Date:** 2026-10-08 | **Status:** ACCEPTED
87
+ - **Context:** Following the consolidation on Jest and TypeScript (ADR-015), an extensive architectural review identified four structural gaps: (1) The architectural validator was tightly bound to the internal template repository lifecycle (`npm run validate`), preventing standalone usage or programmatic evaluation in existing codebases where architectural drift actually occurs. (2) Static checks in CI catch drift only after code is committed; agent runtimes lacked PreToolUse hooks to actively enforce Refactor-Before-Add (blocking bloat in files exceeding 300 lines) and RED-before-GREEN TDD disciplines during execution sessions. (3) Size and complexity limits alone invite Goodhart gaming; structural boundaries (preventing circular import cycles and enforcing Hexagonal/Clean layer boundaries) were unenforced. (4) The core product claim—that Azcodr prevents AI-accelerated architectural drift—lacked an objective, reproducible empirical benchmark.
88
+ - **Decision:** (1) Decouple the validator into a standalone CLI subcommand (`azcodr check [dir] [--silent]` / `azcodr validate [dir]`) and export a typed programmatic API (`validate(workspaceRoot, reporter)` and `createSilentReporter()`). (2) Implement agent-runtime PreToolUse hooks (`.agents/scripts/agent_guard.js`, `src/agent-guard*.ts`) compatible with Claude Code, Antigravity, and OpenHands tool payloads, enforcing: (a) Refactor-Before-Add (rejecting line additions to files >300 lines while allowing line reductions), (b) command safety denylist (blocking destructive shell commands), and (c) RED-before-GREEN TDD state tracking. (3) Implement a zero-dependency boundary engine (`src/boundaries.ts`) providing `buildDependencyGraph()`, `detectDependencyCycles()`, and `detectBoundaryViolations()` for Clean Architecture layering. Resolve Azcodr's own circular dependency (`guards.ts <-> scaffold.ts`). (4) Design a reproducible 3-arm empirical benchmark suite (`benchmark/README.md`, `benchmark/tickets/tickets.json`, `benchmark/evaluate.js`) comprising 10 sequential feature tickets with 3 architectural traps (File Bloat, Circular Dependency, Layer Breach) and an automated drift scorecard harness. (5) Achieve 100.00% full-spectrum test coverage across lines, functions, statements, and branches across all 39 test suites and 486 tests.
89
+ - **Consequences:** ✅ Existing codebases can run `npx azcodr check` without scaffolding. ✅ Agent sessions enforce Refactor-Before-Add and RED-before-GREEN TDD at the prompt boundary. ✅ Structural circular dependencies and layer breaches are machine-checked with zero third-party dependencies. ✅ Empirical drift prevention benchmark is fully specified, reproducible, and automated. ✅ 100.00% lines, functions, branches, and statements coverage verified across both source and scripts.
90
+ - **Enforced In:** `src/validate.ts`, `src/agent-guard*.ts`, `src/boundaries.ts`, `benchmark/`, `tests/cli-check.test.ts`, `tests/agent-guard.test.ts`, `tests/boundaries.test.ts`, `tests/benchmark.test.ts`
91
+
92
+ #### ADR-017: Continuous Mutation and Benchmark CI Gates, OSS Governance and Reference Example
93
+ - **Date:** 2026-10-08 | **Status:** ACCEPTED
94
+ - **Context:** Following the implementation of the empirical benchmark and native mutation testing harness (ADR-016), three operational gaps were identified: (1) Mutation score (100%) and empirical drift-reduction benchmark assertions ran only as manual workstation commands, risking silent regression during PR merges without automated CI enforcement. (2) Open-source project governance remained incomplete without an explicit Code of Conduct (Contributor Covenant v2.1) beside `SECURITY.md` and `CONTRIBUTING.md`. (3) Prospective adopters lacked a concrete, standalone reference application demonstrating how Azcodr boundary enforcement and Clean Architecture operate in a real downstream project.
95
+ - **Decision:** (1) Automate mutation testing (`npm run test:mutation`) and empirical drift-reduction benchmark execution (`node benchmark/run-benchmark.js`) directly within `.github/workflows/ci.yml` under the Node 24 coverage gate job, ensuring 100% mutant kill score and zero drift are verified on every push and PR. Relocate `mutation-test.js` to `benchmark/mutation-test.js` to keep `scripts/` dedicated solely to template validation. (2) Adopt the Contributor Covenant Code of Conduct v2.1 in `CODE_OF_CONDUCT.md`, reference it in `CONTRIBUTING.md`, and include it in `package.json` package files. (3) Author a standalone, zero-dependency reference implementation in `examples/clean-architecture-todo/` adhering strictly to Clean/Hexagonal Architecture (domain entity invariants, ports, use cases, and in-memory adapter), backed by regression test `tests/example-project.test.ts`. (4) Add official shields.io badges in `README.md` reflecting live npm version, JSR scope, CI passing status, 100% test coverage, 100% mutation score, and 0 dependencies.
96
+ - **Consequences:** ✅ Every PR and push automatically verifies 100% mutation resistance and benchmark assertions. ✅ Full open-source governance compliance achieved (`SECURITY.md`, `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`). ✅ Concrete, working reference example proves downstream architectural boundaries and Clean Code limits. ✅ 100.00% lines, functions, statements, and branches coverage maintained across all 40 test suites and 489 tests.
97
+ - **Enforced In:** `.github/workflows/ci.yml`, `benchmark/mutation-test.js`, `CODE_OF_CONDUCT.md`, `examples/clean-architecture-todo/`, `tests/example-project.test.ts`, `README.md`, `package.json`
98
+
99
+ #### ADR-018: First-Class Architectural Boundary and Cycle Inspection CLI Subcommand
100
+ - **Date:** 2026-10-08 | **Status:** ACCEPTED
101
+ - **Context:** Following the implementation of the zero-dependency boundary and cycle engine (`src/boundaries.ts`, ADR-016), inspecting dependency cycles and Clean Architecture layer breaches required either running the empirical benchmark or importing the internal TypeScript engine programmatically. Users and CI pipelines lacked a direct, dedicated CLI entry point (`npx azcodr boundaries [dir]`) to run boundary and circular dependency inspections as a standalone architectural linter.
102
+ - **Decision:** (1) Integrate a dedicated `boundaries` subcommand (with aliases `boundary`, `cycles`) into `src/cli-parse.ts` and `src/cli.ts`. (2) Implement `src/cli-boundaries.ts` to inspect target directories, format colorized/iconographic violation reports, handle silent execution (`--silent`), and resolve target paths (defaulting to `./src` if present, with fallback to current working directory). (3) Author Outside-In TDD test suite `tests/cli-boundaries.test.ts` covering parse argument recognition, target resolution, cycle detection, breach reporting, silent mode, and child-process execution. (4) Maintain Clean Code limits (all files ≤ 300 lines, functions ≤ 30 lines, complexity ≤ 10) and 100.00% full-spectrum statement, branch, function, and line coverage across all 41 test suites.
103
+ - **Consequences:** ✅ Developers and CI workflows can run `npx azcodr boundaries [dir]` or `npx azcodr cycles [dir]` directly without third-party lint dependencies. ✅ Fast, zero-dependency static analysis catches circular imports and Hexagonal layer breaches. ✅ 100.00% lines, functions, statements, and branches coverage preserved across 41 test suites and 501 tests.
104
+ - **Enforced In:** `src/cli-boundaries.ts`, `src/cli-parse.ts`, `src/cli.ts`, `tests/cli-boundaries.test.ts`, `README.md`
105
+
82
106
  #### ADR-011: The Bash Scaffolder Refuses Protected Targets
83
107
  - **Date:** 2026-10-07 | **Status:** ACCEPTED
84
108
  - **Context:** ADR-010 closed the protected-target hole for the Node scaffolder (`lib/scaffold.js`), but the same hole existed in `.agents/skills/lets-build/scripts/bootstrap_workspace.sh`, which runs with no guard at all: invoked with `/` or `~` as the workspace root it would create `src/`, `tests/`, `deploy/`, `specs/` trees there. Its blast radius is smaller than the Node scaffolder's (every file write is create-only — `tokens.json` and `smoke_test.sh` are written only if absent, and `memory.md` is append-only since ADR-009 — except the explicit `AZCODR_RESET_MEMORY=1` reset), so this is pollution rather than destruction. Pollution of `/` or `~` is still unacceptable for a script agents run autonomously.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "azcodr",
3
- "version": "2.2.0",
3
+ "version": "2.4.0",
4
4
  "description": "Enterprise Architecture & Agentic Engineering Starter Template",
5
5
  "type": "module",
6
6
  "bin": {
@@ -29,7 +29,10 @@
29
29
  ".agents",
30
30
  ".gitignore",
31
31
  ".editorconfig",
32
- "LICENSE"
32
+ "LICENSE",
33
+ "SECURITY.md",
34
+ "CONTRIBUTING.md",
35
+ "CODE_OF_CONDUCT.md"
33
36
  ],
34
37
  "keywords": [
35
38
  "starter-template",
@@ -61,6 +64,7 @@
61
64
  "lint": "eslint .",
62
65
  "typecheck": "tsc --noEmit",
63
66
  "validate": "node scripts/validate-cli.js",
67
+ "test:mutation": "node benchmark/mutation-test.js",
64
68
  "prepublishOnly": "npm run build && npm run lint && npm run test:coverage && npm run validate"
65
69
  },
66
70
  "devDependencies": {
@@ -70,5 +74,9 @@
70
74
  "jest": "29.7.0",
71
75
  "ts-jest": "29.2.6",
72
76
  "typescript": "5.7.3"
77
+ },
78
+ "overrides": {
79
+ "braces": "3.0.3",
80
+ "sprintf-js": "1.1.3"
73
81
  }
74
82
  }
@@ -18,7 +18,6 @@ function normalizeLinkTarget(rawTarget) {
18
18
  // paths are external too.
19
19
  if (/^[a-z][a-z0-9+.-]*:/i.test(display)) return null;
20
20
  if (display.startsWith('//')) return null;
21
- if (/^[a-z]:[\\/]/i.test(display)) return null;
22
21
  // Percent-decode so ./exists%2emd resolves like a renderer would.
23
22
  try {
24
23
  return { target: decodeURIComponent(display), display };
@@ -91,7 +91,7 @@ function checkParity(filePath, target, ctx) {
91
91
  agentsContent: ctx.agentsContent,
92
92
  agentsContentMissing: !ctx.agentsContent,
93
93
  agentsFile: ctx.agentsFile,
94
- entries: observed.entries || [],
94
+ entries: observed.entries,
95
95
  isSymlink: Boolean(observed.isSymlink),
96
96
  linkTarget: observed.linkTarget || null,
97
97
  isFile: Boolean(observed.isFile),
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Command safety guard inspecting shell commands against a destructive denylist.
3
+ */
4
+
5
+ export interface CommandViolation {
6
+ blocked: boolean;
7
+ reason?: string;
8
+ command?: string;
9
+ }
10
+
11
+ export interface DenylistRule {
12
+ pattern: RegExp;
13
+ reason: string;
14
+ }
15
+
16
+ export const DESTRUCTIVE_RULES: readonly DenylistRule[] = [
17
+ {
18
+ pattern: /\brm\s+(-[a-z-]*[rf][a-z-]*\s+)+(\/|\/\*|~|~\/\*|\$home|\$\{home\}|\.|\.\.|\.\/|[a-z]:\\|[a-z]:\/)/i,
19
+ reason: 'destructive rm targeting root, home, drive, or the current directory'
20
+ },
21
+ {
22
+ pattern: /(^|\s)rm\s+(-[a-z-]*\s+)*(\/|~|[a-z]:\\|[a-z]:\/)($|\s)/i,
23
+ reason: 'destructive rm targeting root or home'
24
+ },
25
+ {
26
+ pattern: /\brm\s+--recursive.*--force\s+(\/|~|\$home|\.)/i,
27
+ reason: 'destructive rm using long-form flags'
28
+ },
29
+ {
30
+ pattern: /\brm\s+.*--no-preserve-root/i,
31
+ reason: 'rm --no-preserve-root is forbidden under agent execution'
32
+ },
33
+ {
34
+ pattern: /\b(wipefs\s+-a|shred\s+-u|find\s+.*-delete)\b/i,
35
+ reason: 'irreversible disk or mass-delete operation'
36
+ },
37
+ {
38
+ pattern: /\bgit\s+push\s+.*(-f|--force|--mirror)\b/i,
39
+ reason: 'force-push or mirror-push can destroy remote history'
40
+ },
41
+ {
42
+ pattern: /\bgit\s+push\b.*--force-with-lease\b/i,
43
+ reason: 'force-push variant detected'
44
+ },
45
+ {
46
+ pattern: /\bgit\s+(reset\s+--hard|clean\s+-[a-z]*[fd])/i,
47
+ reason: 'destructive git worktree operation (reset --hard / clean)'
48
+ },
49
+ {
50
+ pattern: /\bgit\s+checkout\s+--\s+\./i,
51
+ reason: 'git checkout -- . discards all uncommitted work'
52
+ },
53
+ {
54
+ pattern: /\bgit\s+branch\s+-D\b/i,
55
+ reason: 'force branch delete'
56
+ },
57
+ {
58
+ pattern: /\b(drop\s+(database|schema|table)|truncate\s+(table\s+)?[a-z_])/i,
59
+ reason: 'destructive SQL DDL'
60
+ },
61
+ {
62
+ pattern: /\b(delete\s+from|update\s+[a-z_]+\s+set|alter\s+table)\b/i,
63
+ reason: 'destructive SQL DML'
64
+ },
65
+ {
66
+ pattern: /\b(grant\s+all|revoke\s+all)\b/i,
67
+ reason: 'privilege escalation in SQL'
68
+ },
69
+ {
70
+ pattern: /\b(mkfs|dd\s+if=|fdisk|parted\s+\/dev)\b/i,
71
+ reason: 'raw disk operation'
72
+ },
73
+ {
74
+ pattern: /(:[\s]*\([\s]*\)[\s]*\{|:[\s]*\|[\s]*:)/,
75
+ reason: 'fork bomb'
76
+ },
77
+ {
78
+ pattern: /\b(curl|wget)\s+.*\|\s*(sudo\s+)?(ba)?sh\b/i,
79
+ reason: 'piping download directly into shell execution'
80
+ },
81
+ {
82
+ pattern: /\b(base64\s+-d|base64\s+--decode)\s+.*\|/i,
83
+ reason: 'decoding encoded payload into a pipe'
84
+ },
85
+ {
86
+ pattern: /\b(npm|yarn|pnpm)\s+publish\b/i,
87
+ reason: 'package publish must run via release workflow, not ad-hoc tool call'
88
+ }
89
+ ];
90
+
91
+ export function normalizeCommand(raw: string): string {
92
+ return raw.replace(/[\r\n\t]+/g, ' ').replace(/\s+/g, ' ').trim();
93
+ }
94
+
95
+ /**
96
+ * Checks a command string against the safety denylist.
97
+ *
98
+ * @param command - Raw shell command string.
99
+ * @returns Violation details if blocked, or clean outcome.
100
+ */
101
+ export function inspectCommand(command: string): CommandViolation {
102
+ const normalized = normalizeCommand(command);
103
+ if (!normalized) return { blocked: false };
104
+
105
+ for (const rule of DESTRUCTIVE_RULES) {
106
+ if (rule.pattern.test(normalized)) {
107
+ return {
108
+ blocked: true,
109
+ reason: rule.reason,
110
+ command: normalized.slice(0, 300)
111
+ };
112
+ }
113
+ }
114
+
115
+ return { blocked: false, command: normalized };
116
+ }
117
+
118
+ export default { DESTRUCTIVE_RULES, normalizeCommand, inspectCommand };
@@ -0,0 +1,107 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ export const DEFAULT_MAX_FILE_LINES = 300;
5
+
6
+ export interface FileCheckInput {
7
+ filePath: string;
8
+ incomingContent?: string;
9
+ replacementContent?: string;
10
+ targetContent?: string;
11
+ maxLines?: number;
12
+ }
13
+
14
+ export interface FileCheckResult {
15
+ blocked: boolean;
16
+ reason?: string;
17
+ currentLines: number;
18
+ projectedLines: number;
19
+ maxLines: number;
20
+ }
21
+
22
+ export function countLines(text: string): number {
23
+ if (!text) return 0;
24
+ return text.split('\n').length;
25
+ }
26
+
27
+ export function readExistingLines(filePath: string): number {
28
+ if (!fs.existsSync(filePath)) return 0;
29
+ try {
30
+ const content = fs.readFileSync(filePath, 'utf-8');
31
+ return countLines(content);
32
+ } catch {
33
+ return 0;
34
+ }
35
+ }
36
+
37
+ function calculateProjectedLines(currentLines: number, input: FileCheckInput): number {
38
+ if (input.incomingContent !== undefined) {
39
+ return countLines(input.incomingContent);
40
+ }
41
+ if (input.replacementContent !== undefined) {
42
+ const addedLines = countLines(input.replacementContent);
43
+ const removedLines = input.targetContent !== undefined ? countLines(input.targetContent) : 1;
44
+ return Math.max(0, currentLines + addedLines - removedLines);
45
+ }
46
+ return currentLines;
47
+ }
48
+
49
+ interface ThresholdParams {
50
+ filePath: string;
51
+ currentLines: number;
52
+ projectedLines: number;
53
+ maxLines: number;
54
+ }
55
+
56
+ function evaluateLineThresholds(params: ThresholdParams): FileCheckResult {
57
+ const { filePath, currentLines, projectedLines, maxLines } = params;
58
+ const base = { currentLines, projectedLines, maxLines };
59
+ const relPath = path.basename(filePath);
60
+
61
+ if (currentLines > maxLines) {
62
+ if (projectedLines >= currentLines) {
63
+ return {
64
+ ...base,
65
+ blocked: true,
66
+ reason: `Refactor-Before-Add violation: '${relPath}' currently has ${currentLines} lines (limit: ${maxLines}). Adding or maintaining lines in an overflowing file is blocked. Refactor into modular units under green tests first.`
67
+ };
68
+ }
69
+ return { ...base, blocked: false };
70
+ }
71
+
72
+ if (projectedLines > maxLines) {
73
+ return {
74
+ ...base,
75
+ blocked: true,
76
+ reason: `File line budget exceeded: '${relPath}' would grow to ${projectedLines} lines (limit: ${maxLines}). Decompose into modular components before appending more code.`
77
+ };
78
+ }
79
+
80
+ return { ...base, blocked: false };
81
+ }
82
+
83
+ /**
84
+ * Checks a proposed file write or edit against Refactor-Before-Add rules.
85
+ *
86
+ * @param input - File path and proposed content.
87
+ * @returns Decision result indicating whether the write is blocked.
88
+ */
89
+ export function inspectFileWrite(input: FileCheckInput): FileCheckResult {
90
+ const maxLines = input.maxLines ?? DEFAULT_MAX_FILE_LINES;
91
+ const currentLines = readExistingLines(input.filePath);
92
+ const projectedLines = calculateProjectedLines(currentLines, input);
93
+
94
+ return evaluateLineThresholds({
95
+ filePath: input.filePath,
96
+ currentLines,
97
+ projectedLines,
98
+ maxLines
99
+ });
100
+ }
101
+
102
+ export default {
103
+ DEFAULT_MAX_FILE_LINES,
104
+ countLines,
105
+ readExistingLines,
106
+ inspectFileWrite
107
+ };
@@ -0,0 +1,96 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ export interface SessionTddState {
5
+ lastFailingTestRecorded: boolean;
6
+ lastTestRunTime?: number;
7
+ lastTestPath?: string;
8
+ }
9
+
10
+ export interface TddCheckResult {
11
+ blocked: boolean;
12
+ reason?: string;
13
+ isProductionFile: boolean;
14
+ }
15
+
16
+ export function isTestFile(filePath: string): boolean {
17
+ const norm = filePath.replace(/\\/g, '/').toLowerCase();
18
+ if (/(^|\/)(tests?|__tests__)(\/|$)/i.test(norm)) {
19
+ return true;
20
+ }
21
+ return /\.(test|spec)\.[a-z0-9]+$/i.test(norm);
22
+ }
23
+
24
+ export function isNonCodeFile(filePath: string): boolean {
25
+ const ext = path.extname(filePath).toLowerCase();
26
+ const nonCodeExts = new Set(['.md', '.json', '.yml', '.yaml', '.txt', '.toml', '.lock', '.svg', '.png']);
27
+ return nonCodeExts.has(ext);
28
+ }
29
+
30
+ export function isProductionFile(filePath: string): boolean {
31
+ if (isNonCodeFile(filePath)) return false;
32
+ if (isTestFile(filePath)) return false;
33
+ const norm = filePath.replace(/\\/g, '/').toLowerCase();
34
+ return norm.includes('src/') || norm.includes('lib/') || norm.includes('app/');
35
+ }
36
+
37
+ export function readTddState(stateFile: string): SessionTddState {
38
+ if (!fs.existsSync(stateFile)) {
39
+ return { lastFailingTestRecorded: false };
40
+ }
41
+ try {
42
+ const raw = fs.readFileSync(stateFile, 'utf-8');
43
+ return JSON.parse(raw) as SessionTddState;
44
+ } catch {
45
+ return { lastFailingTestRecorded: false };
46
+ }
47
+ }
48
+
49
+ export function writeTddState(stateFile: string, state: SessionTddState): void {
50
+ try {
51
+ const dir = path.dirname(stateFile);
52
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
53
+ fs.writeFileSync(stateFile, JSON.stringify(state, null, 2), 'utf-8');
54
+ } catch {
55
+ // Fail-safe write: do not crash agent if state cannot be persisted
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Checks whether an edit to a file is allowed under RED-before-GREEN TDD rules.
61
+ *
62
+ * @param filePath - Path to file being edited.
63
+ * @param state - Current session TDD state.
64
+ * @param enforceTestFirst - Whether test-first enforcement is strictly enabled.
65
+ * @returns Decision result indicating whether edit is blocked.
66
+ */
67
+ export function inspectTddRequirement(
68
+ filePath: string,
69
+ state: SessionTddState,
70
+ enforceTestFirst: boolean = false
71
+ ): TddCheckResult {
72
+ const prod = isProductionFile(filePath);
73
+ if (!enforceTestFirst || !prod) {
74
+ return { blocked: false, isProductionFile: prod };
75
+ }
76
+
77
+ if (!state.lastFailingTestRecorded) {
78
+ const baseName = path.basename(filePath);
79
+ return {
80
+ blocked: true,
81
+ isProductionFile: true,
82
+ reason: `Test-First (RED-before-GREEN) requirement: Production file '${baseName}' cannot be edited before a failing test (RED) is recorded. Author a failing unit or acceptance test first, verify failure output, then edit production code.`
83
+ };
84
+ }
85
+
86
+ return { blocked: false, isProductionFile: true };
87
+ }
88
+
89
+ export default {
90
+ isTestFile,
91
+ isNonCodeFile,
92
+ isProductionFile,
93
+ readTddState,
94
+ writeTddState,
95
+ inspectTddRequirement
96
+ };