@webpieces/ai-hook-rules 0.3.184 → 0.3.186

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 (104) hide show
  1. package/package.json +4 -8
  2. package/src/adapters/global-hook.js +3 -3
  3. package/src/adapters/global-hook.js.map +1 -1
  4. package/src/core/custom-rule-adapter.d.ts +21 -0
  5. package/src/core/custom-rule-adapter.js +48 -0
  6. package/src/core/custom-rule-adapter.js.map +1 -0
  7. package/src/core/disable-directives.d.ts +1 -2
  8. package/src/core/disable-directives.js +17 -31
  9. package/src/core/disable-directives.js.map +1 -1
  10. package/src/core/load-rules.d.ts +3 -2
  11. package/src/core/load-rules.js +71 -48
  12. package/src/core/load-rules.js.map +1 -1
  13. package/src/core/rule-base.d.ts +38 -0
  14. package/src/core/rule-base.js +36 -0
  15. package/src/core/rule-base.js.map +1 -0
  16. package/src/core/rules/branch-creation-guard.d.ts +12 -3
  17. package/src/core/rules/branch-creation-guard.js +37 -37
  18. package/src/core/rules/branch-creation-guard.js.map +1 -1
  19. package/src/core/rules/catch-error-pattern.d.ts +10 -3
  20. package/src/core/rules/catch-error-pattern.js +27 -26
  21. package/src/core/rules/catch-error-pattern.js.map +1 -1
  22. package/src/core/rules/index.js +1 -0
  23. package/src/core/rules/index.js.map +1 -1
  24. package/src/core/rules/max-file-lines.d.ts +13 -3
  25. package/src/core/rules/max-file-lines.js +14 -15
  26. package/src/core/rules/max-file-lines.js.map +1 -1
  27. package/src/core/rules/merge-in-progress-guard.d.ts +9 -0
  28. package/src/core/rules/merge-in-progress-guard.js +65 -0
  29. package/src/core/rules/merge-in-progress-guard.js.map +1 -0
  30. package/src/core/rules/no-any-unknown.d.ts +10 -3
  31. package/src/core/rules/no-any-unknown.js +15 -13
  32. package/src/core/rules/no-any-unknown.js.map +1 -1
  33. package/src/core/rules/no-destructure.d.ts +13 -3
  34. package/src/core/rules/no-destructure.js +14 -12
  35. package/src/core/rules/no-destructure.js.map +1 -1
  36. package/src/core/rules/no-direct-main-update.d.ts +9 -3
  37. package/src/core/rules/no-direct-main-update.js +12 -13
  38. package/src/core/rules/no-direct-main-update.js.map +1 -1
  39. package/src/core/rules/no-edit-on-main.d.ts +13 -3
  40. package/src/core/rules/no-edit-on-main.js +14 -14
  41. package/src/core/rules/no-edit-on-main.js.map +1 -1
  42. package/src/core/rules/no-implicit-any.d.ts +10 -3
  43. package/src/core/rules/no-implicit-any.js +13 -12
  44. package/src/core/rules/no-implicit-any.js.map +1 -1
  45. package/src/core/rules/no-js-files.d.ts +13 -3
  46. package/src/core/rules/no-js-files.js +13 -16
  47. package/src/core/rules/no-js-files.js.map +1 -1
  48. package/src/core/rules/no-shell-substitution.d.ts +9 -3
  49. package/src/core/rules/no-shell-substitution.js +22 -23
  50. package/src/core/rules/no-shell-substitution.js.map +1 -1
  51. package/src/core/rules/no-symbol-di-tokens.d.ts +13 -3
  52. package/src/core/rules/no-symbol-di-tokens.js +15 -13
  53. package/src/core/rules/no-symbol-di-tokens.js.map +1 -1
  54. package/src/core/rules/no-unmanaged-exceptions.d.ts +10 -3
  55. package/src/core/rules/no-unmanaged-exceptions.js +18 -17
  56. package/src/core/rules/no-unmanaged-exceptions.js.map +1 -1
  57. package/src/core/rules/pr-creation-guard.d.ts +9 -4
  58. package/src/core/rules/pr-creation-guard.js +36 -72
  59. package/src/core/rules/pr-creation-guard.js.map +1 -1
  60. package/src/core/rules/pr-merge-cleanup.d.ts +9 -3
  61. package/src/core/rules/pr-merge-cleanup.js +13 -14
  62. package/src/core/rules/pr-merge-cleanup.js.map +1 -1
  63. package/src/core/rules/require-return-type.d.ts +10 -3
  64. package/src/core/rules/require-return-type.js +24 -23
  65. package/src/core/rules/require-return-type.js.map +1 -1
  66. package/src/core/rules/throw-cause-required.d.ts +10 -3
  67. package/src/core/rules/throw-cause-required.js +13 -12
  68. package/src/core/rules/throw-cause-required.js.map +1 -1
  69. package/src/core/rules/validate-ts-in-src.d.ts +14 -3
  70. package/src/core/rules/validate-ts-in-src.js +15 -18
  71. package/src/core/rules/validate-ts-in-src.js.map +1 -1
  72. package/src/core/runner.js +38 -67
  73. package/src/core/runner.js.map +1 -1
  74. package/src/core/to-error.js +0 -1
  75. package/src/core/to-error.js.map +1 -1
  76. package/src/core/types.d.ts +14 -13
  77. package/src/core/types.js.map +1 -1
  78. package/src/index.d.ts +21 -1
  79. package/src/index.js +47 -1
  80. package/src/index.js.map +1 -1
  81. package/src/core/configs/default.d.ts +0 -2
  82. package/src/core/configs/default.js +0 -22
  83. package/src/core/configs/default.js.map +0 -1
  84. package/src/scripts/git-gatherInfo.d.ts +0 -2
  85. package/src/scripts/git-gatherInfo.js +0 -98
  86. package/src/scripts/git-gatherInfo.js.map +0 -1
  87. package/src/scripts/git-mergeComplete.d.ts +0 -2
  88. package/src/scripts/git-mergeComplete.js +0 -58
  89. package/src/scripts/git-mergeComplete.js.map +0 -1
  90. package/src/scripts/git-updateFromMain.d.ts +0 -2
  91. package/src/scripts/git-updateFromMain.js +0 -290
  92. package/src/scripts/git-updateFromMain.js.map +0 -1
  93. package/src/scripts/workflow/cleanTmp.d.ts +0 -1
  94. package/src/scripts/workflow/cleanTmp.js +0 -57
  95. package/src/scripts/workflow/cleanTmp.js.map +0 -1
  96. package/src/scripts/workflow/git-findForkPoint.d.ts +0 -2
  97. package/src/scripts/workflow/git-findForkPoint.js +0 -120
  98. package/src/scripts/workflow/git-findForkPoint.js.map +0 -1
  99. package/src/scripts/workflow/git-readAiBranchName.d.ts +0 -2
  100. package/src/scripts/workflow/git-readAiBranchName.js +0 -20
  101. package/src/scripts/workflow/git-readAiBranchName.js.map +0 -1
  102. package/src/scripts/workflow/git-validateUpToDate.d.ts +0 -1
  103. package/src/scripts/workflow/git-validateUpToDate.js +0 -72
  104. package/src/scripts/workflow/git-validateUpToDate.js.map +0 -1
package/src/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatReport = exports.createIsLineDisabled = exports.DirectiveIndex = exports.parseDirectives = exports.stripTsNoise = exports.run = exports.ResolvedRuleConfig = exports.ResolvedConfig = exports.BlockedResult = exports.RuleGroup = exports.FileContext = exports.EditContext = exports.NormalizedToolInput = exports.NormalizedEdit = exports.Violation = void 0;
3
+ exports.formatReport = exports.createIsLineDisabled = exports.DirectiveIndex = exports.parseDirectives = exports.stripTsNoise = exports.run = exports.NoEditOnMainRule = exports.NoJsFilesRule = exports.NoDirectMainUpdateRule = exports.PrMergeCleanupRule = exports.MergeInProgressGuardRule = exports.PrCreationGuardRule = exports.BranchCreationGuardRule = exports.NoSymbolDiTokensRule = exports.NoShellSubstitutionRule = exports.ThrowCauseRequiredRule = exports.CatchErrorPatternRule = exports.NoUnmanagedExceptionsRule = exports.RequireReturnTypeRule = exports.NoDestructureRule = exports.ValidateTsInSrcRule = exports.MaxFileLinesRule = exports.NoImplicitAnyRule = exports.NoAnyUnknownRule = exports.CustomRuleAdapter = exports.EmptyRuleConfig = exports.BashRuleBase = exports.FileRuleBase = exports.EditRuleBase = exports.ResolvedRuleConfig = exports.ResolvedConfig = exports.BlockedResult = exports.RuleGroup = exports.BashContext = exports.FileContext = exports.EditContext = exports.NormalizedToolInput = exports.NormalizedEdit = exports.Violation = void 0;
4
4
  // Pluggable write-time validation framework for AI coding agents
5
5
  var types_1 = require("./core/types");
6
6
  Object.defineProperty(exports, "Violation", { enumerable: true, get: function () { return types_1.Violation; } });
@@ -8,10 +8,56 @@ Object.defineProperty(exports, "NormalizedEdit", { enumerable: true, get: functi
8
8
  Object.defineProperty(exports, "NormalizedToolInput", { enumerable: true, get: function () { return types_1.NormalizedToolInput; } });
9
9
  Object.defineProperty(exports, "EditContext", { enumerable: true, get: function () { return types_1.EditContext; } });
10
10
  Object.defineProperty(exports, "FileContext", { enumerable: true, get: function () { return types_1.FileContext; } });
11
+ Object.defineProperty(exports, "BashContext", { enumerable: true, get: function () { return types_1.BashContext; } });
11
12
  Object.defineProperty(exports, "RuleGroup", { enumerable: true, get: function () { return types_1.RuleGroup; } });
12
13
  Object.defineProperty(exports, "BlockedResult", { enumerable: true, get: function () { return types_1.BlockedResult; } });
13
14
  Object.defineProperty(exports, "ResolvedConfig", { enumerable: true, get: function () { return types_1.ResolvedConfig; } });
14
15
  Object.defineProperty(exports, "ResolvedRuleConfig", { enumerable: true, get: function () { return types_1.ResolvedRuleConfig; } });
16
+ // Scope-specific rule bases (each extends the shared AbstractRule from @webpieces/rules-config)
17
+ var rule_base_1 = require("./core/rule-base");
18
+ Object.defineProperty(exports, "EditRuleBase", { enumerable: true, get: function () { return rule_base_1.EditRuleBase; } });
19
+ Object.defineProperty(exports, "FileRuleBase", { enumerable: true, get: function () { return rule_base_1.FileRuleBase; } });
20
+ Object.defineProperty(exports, "BashRuleBase", { enumerable: true, get: function () { return rule_base_1.BashRuleBase; } });
21
+ Object.defineProperty(exports, "EmptyRuleConfig", { enumerable: true, get: function () { return rule_base_1.EmptyRuleConfig; } });
22
+ var custom_rule_adapter_1 = require("./core/custom-rule-adapter");
23
+ Object.defineProperty(exports, "CustomRuleAdapter", { enumerable: true, get: function () { return custom_rule_adapter_1.CustomRuleAdapter; } });
24
+ // Built-in rule classes — each constructed with its typed *Config from @webpieces/rules-config
25
+ var no_any_unknown_1 = require("./core/rules/no-any-unknown");
26
+ Object.defineProperty(exports, "NoAnyUnknownRule", { enumerable: true, get: function () { return no_any_unknown_1.NoAnyUnknownRule; } });
27
+ var no_implicit_any_1 = require("./core/rules/no-implicit-any");
28
+ Object.defineProperty(exports, "NoImplicitAnyRule", { enumerable: true, get: function () { return no_implicit_any_1.NoImplicitAnyRule; } });
29
+ var max_file_lines_1 = require("./core/rules/max-file-lines");
30
+ Object.defineProperty(exports, "MaxFileLinesRule", { enumerable: true, get: function () { return max_file_lines_1.MaxFileLinesRule; } });
31
+ var validate_ts_in_src_1 = require("./core/rules/validate-ts-in-src");
32
+ Object.defineProperty(exports, "ValidateTsInSrcRule", { enumerable: true, get: function () { return validate_ts_in_src_1.ValidateTsInSrcRule; } });
33
+ var no_destructure_1 = require("./core/rules/no-destructure");
34
+ Object.defineProperty(exports, "NoDestructureRule", { enumerable: true, get: function () { return no_destructure_1.NoDestructureRule; } });
35
+ var require_return_type_1 = require("./core/rules/require-return-type");
36
+ Object.defineProperty(exports, "RequireReturnTypeRule", { enumerable: true, get: function () { return require_return_type_1.RequireReturnTypeRule; } });
37
+ var no_unmanaged_exceptions_1 = require("./core/rules/no-unmanaged-exceptions");
38
+ Object.defineProperty(exports, "NoUnmanagedExceptionsRule", { enumerable: true, get: function () { return no_unmanaged_exceptions_1.NoUnmanagedExceptionsRule; } });
39
+ var catch_error_pattern_1 = require("./core/rules/catch-error-pattern");
40
+ Object.defineProperty(exports, "CatchErrorPatternRule", { enumerable: true, get: function () { return catch_error_pattern_1.CatchErrorPatternRule; } });
41
+ var throw_cause_required_1 = require("./core/rules/throw-cause-required");
42
+ Object.defineProperty(exports, "ThrowCauseRequiredRule", { enumerable: true, get: function () { return throw_cause_required_1.ThrowCauseRequiredRule; } });
43
+ var no_shell_substitution_1 = require("./core/rules/no-shell-substitution");
44
+ Object.defineProperty(exports, "NoShellSubstitutionRule", { enumerable: true, get: function () { return no_shell_substitution_1.NoShellSubstitutionRule; } });
45
+ var no_symbol_di_tokens_1 = require("./core/rules/no-symbol-di-tokens");
46
+ Object.defineProperty(exports, "NoSymbolDiTokensRule", { enumerable: true, get: function () { return no_symbol_di_tokens_1.NoSymbolDiTokensRule; } });
47
+ var branch_creation_guard_1 = require("./core/rules/branch-creation-guard");
48
+ Object.defineProperty(exports, "BranchCreationGuardRule", { enumerable: true, get: function () { return branch_creation_guard_1.BranchCreationGuardRule; } });
49
+ var pr_creation_guard_1 = require("./core/rules/pr-creation-guard");
50
+ Object.defineProperty(exports, "PrCreationGuardRule", { enumerable: true, get: function () { return pr_creation_guard_1.PrCreationGuardRule; } });
51
+ var merge_in_progress_guard_1 = require("./core/rules/merge-in-progress-guard");
52
+ Object.defineProperty(exports, "MergeInProgressGuardRule", { enumerable: true, get: function () { return merge_in_progress_guard_1.MergeInProgressGuardRule; } });
53
+ var pr_merge_cleanup_1 = require("./core/rules/pr-merge-cleanup");
54
+ Object.defineProperty(exports, "PrMergeCleanupRule", { enumerable: true, get: function () { return pr_merge_cleanup_1.PrMergeCleanupRule; } });
55
+ var no_direct_main_update_1 = require("./core/rules/no-direct-main-update");
56
+ Object.defineProperty(exports, "NoDirectMainUpdateRule", { enumerable: true, get: function () { return no_direct_main_update_1.NoDirectMainUpdateRule; } });
57
+ var no_js_files_1 = require("./core/rules/no-js-files");
58
+ Object.defineProperty(exports, "NoJsFilesRule", { enumerable: true, get: function () { return no_js_files_1.NoJsFilesRule; } });
59
+ var no_edit_on_main_1 = require("./core/rules/no-edit-on-main");
60
+ Object.defineProperty(exports, "NoEditOnMainRule", { enumerable: true, get: function () { return no_edit_on_main_1.NoEditOnMainRule; } });
15
61
  var runner_1 = require("./core/runner");
16
62
  Object.defineProperty(exports, "run", { enumerable: true, get: function () { return runner_1.run; } });
17
63
  var strip_ts_noise_1 = require("./core/strip-ts-noise");
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/tooling/ai-hook-rules/src/index.ts"],"names":[],"mappings":";;;AAAA,iEAAiE;AACjE,sCAOsB;AALlB,kGAAA,SAAS,OAAA;AAAE,uGAAA,cAAc,OAAA;AAAE,4GAAA,mBAAmB,OAAA;AAC9C,oGAAA,WAAW,OAAA;AAAE,oGAAA,WAAW,OAAA;AAExB,kGAAA,SAAS,OAAA;AAAE,sGAAA,aAAa,OAAA;AACxB,uGAAA,cAAc,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AAGtC,wCAAoC;AAA3B,6FAAA,GAAG,OAAA;AACZ,wDAAqD;AAA5C,8GAAA,YAAY,OAAA;AACrB,gEAAkG;AAAzF,qHAAA,eAAe,OAAA;AAAE,oHAAA,cAAc,OAAA;AAAE,0HAAA,oBAAoB,OAAA;AAC9D,wCAA6C;AAApC,sGAAA,YAAY,OAAA","sourcesContent":["// Pluggable write-time validation framework for AI coding agents\nexport {\n ToolKind, RuleScope, RuleOptions, IsLineDisabled,\n Violation, NormalizedEdit, NormalizedToolInput,\n EditContext, FileContext,\n Rule, EditRule, FileRule,\n RuleGroup, BlockedResult,\n ResolvedConfig, ResolvedRuleConfig,\n} from './core/types';\n\nexport { run } from './core/runner';\nexport { stripTsNoise } from './core/strip-ts-noise';\nexport { parseDirectives, DirectiveIndex, createIsLineDisabled } from './core/disable-directives';\nexport { formatReport } from './core/report';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/tooling/ai-hook-rules/src/index.ts"],"names":[],"mappings":";;;AAAA,iEAAiE;AACjE,sCAOsB;AALlB,kGAAA,SAAS,OAAA;AAAE,uGAAA,cAAc,OAAA;AAAE,4GAAA,mBAAmB,OAAA;AAC9C,oGAAA,WAAW,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,oGAAA,WAAW,OAAA;AAErC,kGAAA,SAAS,OAAA;AAAE,sGAAA,aAAa,OAAA;AACxB,uGAAA,cAAc,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AAGtC,gGAAgG;AAChG,8CAA6F;AAApF,yGAAA,YAAY,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,4GAAA,eAAe,OAAA;AAClE,kEAA+D;AAAtD,wHAAA,iBAAiB,OAAA;AAE1B,+FAA+F;AAC/F,8DAA+D;AAAtD,kHAAA,gBAAgB,OAAA;AACzB,gEAAiE;AAAxD,oHAAA,iBAAiB,OAAA;AAC1B,8DAA+D;AAAtD,kHAAA,gBAAgB,OAAA;AACzB,sEAAsE;AAA7D,yHAAA,mBAAmB,OAAA;AAC5B,8DAAgE;AAAvD,mHAAA,iBAAiB,OAAA;AAC1B,wEAAyE;AAAhE,4HAAA,qBAAqB,OAAA;AAC9B,gFAAiF;AAAxE,oIAAA,yBAAyB,OAAA;AAClC,wEAAyE;AAAhE,4HAAA,qBAAqB,OAAA;AAC9B,0EAA2E;AAAlE,8HAAA,sBAAsB,OAAA;AAC/B,4EAA6E;AAApE,gIAAA,uBAAuB,OAAA;AAChC,wEAAwE;AAA/D,2HAAA,oBAAoB,OAAA;AAC7B,4EAA6E;AAApE,gIAAA,uBAAuB,OAAA;AAChC,oEAAqE;AAA5D,wHAAA,mBAAmB,OAAA;AAC5B,gFAAgF;AAAvE,mIAAA,wBAAwB,OAAA;AACjC,kEAAmE;AAA1D,sHAAA,kBAAkB,OAAA;AAC3B,4EAA4E;AAAnE,+HAAA,sBAAsB,OAAA;AAC/B,wDAAyD;AAAhD,4GAAA,aAAa,OAAA;AACtB,gEAAgE;AAAvD,mHAAA,gBAAgB,OAAA;AAEzB,wCAAoC;AAA3B,6FAAA,GAAG,OAAA;AACZ,wDAAqD;AAA5C,8GAAA,YAAY,OAAA;AACrB,gEAAkG;AAAzF,qHAAA,eAAe,OAAA;AAAE,oHAAA,cAAc,OAAA;AAAE,0HAAA,oBAAoB,OAAA;AAC9D,wCAA6C;AAApC,sGAAA,YAAY,OAAA","sourcesContent":["// Pluggable write-time validation framework for AI coding agents\nexport {\n ToolKind, RuleScope, RuleOptions, IsLineDisabled,\n Violation, NormalizedEdit, NormalizedToolInput,\n EditContext, FileContext, BashContext,\n Rule, PlainRule,\n RuleGroup, BlockedResult,\n ResolvedConfig, ResolvedRuleConfig,\n} from './core/types';\n\n// Scope-specific rule bases (each extends the shared AbstractRule from @webpieces/rules-config)\nexport { EditRuleBase, FileRuleBase, BashRuleBase, EmptyRuleConfig } from './core/rule-base';\nexport { CustomRuleAdapter } from './core/custom-rule-adapter';\n\n// Built-in rule classes — each constructed with its typed *Config from @webpieces/rules-config\nexport { NoAnyUnknownRule } from './core/rules/no-any-unknown';\nexport { NoImplicitAnyRule } from './core/rules/no-implicit-any';\nexport { MaxFileLinesRule } from './core/rules/max-file-lines';\nexport { ValidateTsInSrcRule } from './core/rules/validate-ts-in-src';\nexport { NoDestructureRule } from './core/rules/no-destructure';\nexport { RequireReturnTypeRule } from './core/rules/require-return-type';\nexport { NoUnmanagedExceptionsRule } from './core/rules/no-unmanaged-exceptions';\nexport { CatchErrorPatternRule } from './core/rules/catch-error-pattern';\nexport { ThrowCauseRequiredRule } from './core/rules/throw-cause-required';\nexport { NoShellSubstitutionRule } from './core/rules/no-shell-substitution';\nexport { NoSymbolDiTokensRule } from './core/rules/no-symbol-di-tokens';\nexport { BranchCreationGuardRule } from './core/rules/branch-creation-guard';\nexport { PrCreationGuardRule } from './core/rules/pr-creation-guard';\nexport { MergeInProgressGuardRule } from './core/rules/merge-in-progress-guard';\nexport { PrMergeCleanupRule } from './core/rules/pr-merge-cleanup';\nexport { NoDirectMainUpdateRule } from './core/rules/no-direct-main-update';\nexport { NoJsFilesRule } from './core/rules/no-js-files';\nexport { NoEditOnMainRule } from './core/rules/no-edit-on-main';\n\nexport { run } from './core/runner';\nexport { stripTsNoise } from './core/strip-ts-noise';\nexport { parseDirectives, DirectiveIndex, createIsLineDisabled } from './core/disable-directives';\nexport { formatReport } from './core/report';\n"]}
@@ -1,2 +0,0 @@
1
- export declare const defaultRules: Record<string, Record<string, unknown>>;
2
- export declare const defaultRulesDir: readonly string[];
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defaultRulesDir = exports.defaultRules = void 0;
4
- // webpieces-disable no-any-unknown -- rule options are opaque at framework level
5
- exports.defaultRules = {
6
- 'no-any-unknown': { mode: 'ON' },
7
- 'max-file-lines': { mode: 'ON', limit: 900 },
8
- 'validate-ts-in-src': {
9
- mode: 'ON',
10
- allowedRootFiles: ['jest.setup.ts'],
11
- excludePaths: [
12
- 'node_modules', 'dist', '.nx', '.git',
13
- 'architecture', 'tmp', 'scripts',
14
- ],
15
- },
16
- 'no-destructure': { mode: 'ON', allowTopLevel: true },
17
- 'require-return-type': { mode: 'ON' },
18
- 'no-unmanaged-exceptions': { mode: 'ON' },
19
- 'catch-error-pattern': { mode: 'ON' },
20
- };
21
- exports.defaultRulesDir = [];
22
- //# sourceMappingURL=default.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"default.js","sourceRoot":"","sources":["../../../../../../../packages/tooling/ai-hook-rules/src/core/configs/default.ts"],"names":[],"mappings":";;;AAAA,iFAAiF;AACpE,QAAA,YAAY,GAA4C;IACjE,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;IAChC,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE;IAC5C,oBAAoB,EAAE;QAClB,IAAI,EAAE,IAAI;QACV,gBAAgB,EAAE,CAAC,eAAe,CAAC;QACnC,YAAY,EAAE;YACV,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;YACrC,cAAc,EAAE,KAAK,EAAE,SAAS;SACnC;KACJ;IACD,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IACrD,qBAAqB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;IACrC,yBAAyB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;IACzC,qBAAqB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;CACxC,CAAC;AAEW,QAAA,eAAe,GAAsB,EAAE,CAAC","sourcesContent":["// webpieces-disable no-any-unknown -- rule options are opaque at framework level\nexport const defaultRules: Record<string, Record<string, unknown>> = {\n 'no-any-unknown': { mode: 'ON' },\n 'max-file-lines': { mode: 'ON', limit: 900 },\n 'validate-ts-in-src': {\n mode: 'ON',\n allowedRootFiles: ['jest.setup.ts'],\n excludePaths: [\n 'node_modules', 'dist', '.nx', '.git',\n 'architecture', 'tmp', 'scripts',\n ],\n },\n 'no-destructure': { mode: 'ON', allowTopLevel: true },\n 'require-return-type': { mode: 'ON' },\n 'no-unmanaged-exceptions': { mode: 'ON' },\n 'catch-error-pattern': { mode: 'ON' },\n};\n\nexport const defaultRulesDir: readonly string[] = [];\n"]}
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export declare function main(): Promise<void>;
@@ -1,98 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.main = main;
5
- const tslib_1 = require("tslib");
6
- const child_process_1 = require("child_process");
7
- const fs = tslib_1.__importStar(require("fs"));
8
- const path = tslib_1.__importStar(require("path"));
9
- const git_readAiBranchName_1 = require("./workflow/git-readAiBranchName");
10
- const git_findForkPoint_1 = require("./workflow/git-findForkPoint");
11
- const SEP = '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
12
- function validateCleanTree(currentBranch) {
13
- if (currentBranch === 'main') {
14
- process.stderr.write('❌ Error: Already on main branch. No need to update from main.\n');
15
- process.exit(1);
16
- }
17
- process.stderr.write(`Current branch: ${currentBranch}\n`);
18
- const hasDirtyFiles = (0, child_process_1.spawnSync)('git', ['diff-index', '--quiet', 'HEAD', '--']).status !== 0;
19
- if (!hasDirtyFiles)
20
- return;
21
- const changedFiles = (0, child_process_1.execSync)('git diff --name-only HEAD', { encoding: 'utf8' }).trim();
22
- process.stderr.write('\n');
23
- process.stderr.write(SEP);
24
- process.stderr.write('❌ ERROR: You have uncommitted changes\n');
25
- process.stderr.write(SEP);
26
- process.stderr.write('\n');
27
- process.stderr.write('Please commit or stash your changes before updating from main.\n');
28
- process.stderr.write('\n');
29
- process.stderr.write('Files with changes:\n');
30
- process.stderr.write(changedFiles + '\n');
31
- process.stderr.write('\n');
32
- process.stderr.write('\x1b[1;31mTo commit your changes, run:\n');
33
- process.stderr.write(' git add -A && git commit -m "your message"\x1b[0m\n');
34
- process.stderr.write('\n');
35
- process.stderr.write('Or to stash them temporarily:\n');
36
- process.stderr.write(' git stash\n');
37
- process.stderr.write(' pnpm wp-git-update\n');
38
- process.stderr.write(' git stash pop\n');
39
- process.stderr.write('\n');
40
- process.stderr.write(SEP);
41
- process.exit(1);
42
- }
43
- function printHashPoints(hashes, currentBranch, mergeDir) {
44
- process.stderr.write('📍 The 3 Hash Points:\n');
45
- process.stderr.write(` 1. Fork point (A): ${hashes.hashForkPoint}\n`);
46
- process.stderr.write(` (where ${currentBranch} diverged from main)\n`);
47
- process.stderr.write('\n');
48
- process.stderr.write(` 2. Feature HEAD (B): ${hashes.hashFeatureHead}\n`);
49
- process.stderr.write(` (tip of ${currentBranch})\n`);
50
- process.stderr.write('\n');
51
- process.stderr.write(` 3. Main HEAD (C): ${hashes.hashMainHead}\n`);
52
- process.stderr.write(' (current origin/main)\n');
53
- process.stderr.write('\n');
54
- process.stderr.write(`Merge directory: ${mergeDir}\n`);
55
- process.stderr.write('\n');
56
- }
57
- async function main() {
58
- const currentBranch = (0, child_process_1.execSync)('git branch --show-current', { encoding: 'utf8' }).trim();
59
- const featureName = (0, git_readAiBranchName_1.getFeatureName)();
60
- const repoRoot = (0, child_process_1.execSync)('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();
61
- const mergeDir = path.join(repoRoot, 'webpiecesTmp', `merge-${featureName}`);
62
- fs.mkdirSync(mergeDir, { recursive: true });
63
- validateCleanTree(currentBranch);
64
- process.stderr.write('\n');
65
- process.stderr.write(SEP);
66
- process.stderr.write('📍 Gathering Merge Context\n');
67
- process.stderr.write(SEP);
68
- process.stderr.write('\n');
69
- process.stderr.write('Fetching latest changes from origin/main...\n');
70
- (0, child_process_1.spawnSync)('git', ['fetch', 'origin', 'main'], { stdio: 'inherit' });
71
- await (0, git_findForkPoint_1.findForkPoint)('merge');
72
- const hashesFile = path.join(mergeDir, 'updatemain-hashes.json');
73
- const hashes = JSON.parse(fs.readFileSync(hashesFile, 'utf8'));
74
- printHashPoints(hashes, currentBranch, mergeDir);
75
- if (hashes.hashForkPoint === hashes.hashMainHead) {
76
- process.stderr.write(SEP);
77
- process.stderr.write('✅ Already up to date with main!\n');
78
- process.stderr.write(SEP);
79
- process.stderr.write('\n');
80
- process.stderr.write('Your branch has not diverged from main.\n');
81
- process.stderr.write('There are no new changes from main to merge.\n');
82
- process.stderr.write('\n');
83
- process.stderr.write(SEP);
84
- process.exit(0);
85
- }
86
- process.stderr.write('Main has advanced. Merge will be needed.\n');
87
- process.stderr.write('\n');
88
- process.stderr.write(SEP);
89
- process.stderr.write('\n');
90
- }
91
- if (require.main === module) {
92
- main().catch((err) => {
93
- const message = err instanceof Error ? err.message : String(err);
94
- process.stderr.write(message + '\n');
95
- process.exit(1);
96
- });
97
- }
98
- //# sourceMappingURL=git-gatherInfo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git-gatherInfo.js","sourceRoot":"","sources":["../../../../../../packages/tooling/ai-hook-rules/src/scripts/git-gatherInfo.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { execSync, spawnSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { getFeatureName } from './workflow/git-readAiBranchName';\nimport { findForkPoint } from './workflow/git-findForkPoint';\n\nconst SEP = '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n';\n\ninterface HashPoints {\n hashForkPoint: string;\n hashFeatureHead: string;\n hashMainHead: string;\n}\n\nfunction validateCleanTree(currentBranch: string): void {\n if (currentBranch === 'main') {\n process.stderr.write('❌ Error: Already on main branch. No need to update from main.\\n');\n process.exit(1);\n }\n\n process.stderr.write(`Current branch: ${currentBranch}\\n`);\n\n const hasDirtyFiles = spawnSync('git', ['diff-index', '--quiet', 'HEAD', '--']).status !== 0;\n if (!hasDirtyFiles) return;\n\n const changedFiles = execSync('git diff --name-only HEAD', { encoding: 'utf8' }).trim();\n process.stderr.write('\\n');\n process.stderr.write(SEP);\n process.stderr.write('❌ ERROR: You have uncommitted changes\\n');\n process.stderr.write(SEP);\n process.stderr.write('\\n');\n process.stderr.write('Please commit or stash your changes before updating from main.\\n');\n process.stderr.write('\\n');\n process.stderr.write('Files with changes:\\n');\n process.stderr.write(changedFiles + '\\n');\n process.stderr.write('\\n');\n process.stderr.write('\\x1b[1;31mTo commit your changes, run:\\n');\n process.stderr.write(' git add -A && git commit -m \"your message\"\\x1b[0m\\n');\n process.stderr.write('\\n');\n process.stderr.write('Or to stash them temporarily:\\n');\n process.stderr.write(' git stash\\n');\n process.stderr.write(' pnpm wp-git-update\\n');\n process.stderr.write(' git stash pop\\n');\n process.stderr.write('\\n');\n process.stderr.write(SEP);\n process.exit(1);\n}\n\nfunction printHashPoints(hashes: HashPoints, currentBranch: string, mergeDir: string): void {\n process.stderr.write('📍 The 3 Hash Points:\\n');\n process.stderr.write(` 1. Fork point (A): ${hashes.hashForkPoint}\\n`);\n process.stderr.write(` (where ${currentBranch} diverged from main)\\n`);\n process.stderr.write('\\n');\n process.stderr.write(` 2. Feature HEAD (B): ${hashes.hashFeatureHead}\\n`);\n process.stderr.write(` (tip of ${currentBranch})\\n`);\n process.stderr.write('\\n');\n process.stderr.write(` 3. Main HEAD (C): ${hashes.hashMainHead}\\n`);\n process.stderr.write(' (current origin/main)\\n');\n process.stderr.write('\\n');\n process.stderr.write(`Merge directory: ${mergeDir}\\n`);\n process.stderr.write('\\n');\n}\n\nexport async function main(): Promise<void> {\n const currentBranch = execSync('git branch --show-current', { encoding: 'utf8' }).trim();\n const featureName = getFeatureName();\n const repoRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();\n const mergeDir = path.join(repoRoot, 'webpiecesTmp', `merge-${featureName}`);\n fs.mkdirSync(mergeDir, { recursive: true });\n\n validateCleanTree(currentBranch);\n\n process.stderr.write('\\n');\n process.stderr.write(SEP);\n process.stderr.write('📍 Gathering Merge Context\\n');\n process.stderr.write(SEP);\n process.stderr.write('\\n');\n process.stderr.write('Fetching latest changes from origin/main...\\n');\n spawnSync('git', ['fetch', 'origin', 'main'], { stdio: 'inherit' });\n\n await findForkPoint('merge');\n\n const hashesFile = path.join(mergeDir, 'updatemain-hashes.json');\n const hashes = JSON.parse(fs.readFileSync(hashesFile, 'utf8')) as HashPoints;\n\n printHashPoints(hashes, currentBranch, mergeDir);\n\n if (hashes.hashForkPoint === hashes.hashMainHead) {\n process.stderr.write(SEP);\n process.stderr.write('✅ Already up to date with main!\\n');\n process.stderr.write(SEP);\n process.stderr.write('\\n');\n process.stderr.write('Your branch has not diverged from main.\\n');\n process.stderr.write('There are no new changes from main to merge.\\n');\n process.stderr.write('\\n');\n process.stderr.write(SEP);\n process.exit(0);\n }\n\n process.stderr.write('Main has advanced. Merge will be needed.\\n');\n process.stderr.write('\\n');\n process.stderr.write(SEP);\n process.stderr.write('\\n');\n}\n\nif (require.main === module) {\n main().catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(message + '\\n');\n process.exit(1);\n });\n}\n"]}
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export declare function main(): Promise<void>;
@@ -1,58 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.main = main;
5
- const child_process_1 = require("child_process");
6
- const SEP = '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
7
- async function main() {
8
- process.stdout.write(SEP);
9
- process.stdout.write('📝 Staging Merge Changes for Review\n');
10
- process.stdout.write(SEP);
11
- process.stdout.write('\n');
12
- const currentBranch = (0, child_process_1.execSync)('git branch --show-current', { encoding: 'utf8' }).trim();
13
- const originMainResult = (0, child_process_1.spawnSync)('git', ['rev-parse', 'origin/main'], { encoding: 'utf8' });
14
- const mainFallbackResult = (0, child_process_1.spawnSync)('git', ['rev-parse', 'main'], { encoding: 'utf8' });
15
- const newForkPoint = (originMainResult.status === 0
16
- ? (originMainResult.stdout ?? '')
17
- : (mainFallbackResult.stdout ?? '')).trim();
18
- const inMergeState = (0, child_process_1.spawnSync)('git', ['rev-parse', '--verify', 'MERGE_HEAD']).status === 0;
19
- let oldForkPoint;
20
- if (inMergeState) {
21
- const mergeHead = (0, child_process_1.execSync)('git rev-parse MERGE_HEAD', { encoding: 'utf8' }).trim();
22
- const result = (0, child_process_1.spawnSync)('git', ['merge-base', mergeHead, 'origin/main'], { encoding: 'utf8' });
23
- oldForkPoint = (result.stdout ?? '').trim();
24
- }
25
- else {
26
- const result = (0, child_process_1.spawnSync)('git', ['merge-base', 'HEAD', 'origin/main'], { encoding: 'utf8' });
27
- oldForkPoint = (result.stdout ?? '').trim();
28
- }
29
- process.stdout.write(`Branch: ${currentBranch}\n`);
30
- process.stdout.write(`Old fork point: ${oldForkPoint.slice(0, 12)}\n`);
31
- process.stdout.write(`New fork point: ${newForkPoint.slice(0, 12)}\n`);
32
- process.stdout.write('\n');
33
- process.stdout.write('Staging all resolved changes...\n');
34
- (0, child_process_1.spawnSync)('git', ['add', '-A'], { stdio: 'inherit' });
35
- process.stdout.write('\n');
36
- process.stdout.write(SEP);
37
- process.stdout.write('✅ All changes staged for review\n');
38
- process.stdout.write(SEP);
39
- process.stdout.write('\n');
40
- process.stdout.write('📋 Review staged changes with:\n');
41
- process.stdout.write(' git diff --cached\n');
42
- process.stdout.write('\n');
43
- process.stdout.write('📋 View list of changed files:\n');
44
- process.stdout.write(' git status\n');
45
- process.stdout.write('\n');
46
- process.stdout.write('⚠️ REVIEW CAREFULLY before committing!\n');
47
- process.stdout.write('\n');
48
- process.stdout.write('When ready to commit, pnpm wp-git-update will continue.\n');
49
- process.stdout.write('\n');
50
- }
51
- if (require.main === module) {
52
- main().catch((err) => {
53
- const message = err instanceof Error ? err.message : String(err);
54
- process.stderr.write(message + '\n');
55
- process.exit(1);
56
- });
57
- }
58
- //# sourceMappingURL=git-mergeComplete.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git-mergeComplete.js","sourceRoot":"","sources":["../../../../../../packages/tooling/ai-hook-rules/src/scripts/git-mergeComplete.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { execSync, spawnSync } from 'child_process';\n\nconst SEP = '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n';\n\nexport async function main(): Promise<void> {\n process.stdout.write(SEP);\n process.stdout.write('📝 Staging Merge Changes for Review\\n');\n process.stdout.write(SEP);\n process.stdout.write('\\n');\n\n const currentBranch = execSync('git branch --show-current', { encoding: 'utf8' }).trim();\n\n const originMainResult = spawnSync('git', ['rev-parse', 'origin/main'], { encoding: 'utf8' });\n const mainFallbackResult = spawnSync('git', ['rev-parse', 'main'], { encoding: 'utf8' });\n const newForkPoint = (\n originMainResult.status === 0\n ? (originMainResult.stdout ?? '')\n : (mainFallbackResult.stdout ?? '')\n ).trim();\n\n const inMergeState = spawnSync('git', ['rev-parse', '--verify', 'MERGE_HEAD']).status === 0;\n\n let oldForkPoint: string;\n if (inMergeState) {\n const mergeHead = execSync('git rev-parse MERGE_HEAD', { encoding: 'utf8' }).trim();\n const result = spawnSync('git', ['merge-base', mergeHead, 'origin/main'], { encoding: 'utf8' });\n oldForkPoint = (result.stdout ?? '').trim();\n } else {\n const result = spawnSync('git', ['merge-base', 'HEAD', 'origin/main'], { encoding: 'utf8' });\n oldForkPoint = (result.stdout ?? '').trim();\n }\n\n process.stdout.write(`Branch: ${currentBranch}\\n`);\n process.stdout.write(`Old fork point: ${oldForkPoint.slice(0, 12)}\\n`);\n process.stdout.write(`New fork point: ${newForkPoint.slice(0, 12)}\\n`);\n process.stdout.write('\\n');\n\n process.stdout.write('Staging all resolved changes...\\n');\n spawnSync('git', ['add', '-A'], { stdio: 'inherit' });\n\n process.stdout.write('\\n');\n process.stdout.write(SEP);\n process.stdout.write('✅ All changes staged for review\\n');\n process.stdout.write(SEP);\n process.stdout.write('\\n');\n process.stdout.write('📋 Review staged changes with:\\n');\n process.stdout.write(' git diff --cached\\n');\n process.stdout.write('\\n');\n process.stdout.write('📋 View list of changed files:\\n');\n process.stdout.write(' git status\\n');\n process.stdout.write('\\n');\n process.stdout.write('⚠️ REVIEW CAREFULLY before committing!\\n');\n process.stdout.write('\\n');\n process.stdout.write('When ready to commit, pnpm wp-git-update will continue.\\n');\n process.stdout.write('\\n');\n}\n\nif (require.main === module) {\n main().catch((err) => {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(message + '\\n');\n process.exit(1);\n });\n}\n"]}
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export declare function main(): Promise<void>;
@@ -1,290 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.main = main;
5
- const tslib_1 = require("tslib");
6
- const child_process_1 = require("child_process");
7
- const fs = tslib_1.__importStar(require("fs"));
8
- const path = tslib_1.__importStar(require("path"));
9
- const readline = tslib_1.__importStar(require("readline"));
10
- const git_readAiBranchName_1 = require("./workflow/git-readAiBranchName");
11
- const git_gatherInfo_1 = require("./git-gatherInfo");
12
- const cleanTmp_1 = require("./workflow/cleanTmp");
13
- const SEP = '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
14
- function getAiMergePreference() {
15
- const settingsFile = path.join(process.env['HOME'] ?? '', '.webpieces', 'settings.json');
16
- if (!fs.existsSync(settingsFile))
17
- return null;
18
- const settings = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
19
- if (settings.ai_merge_conflicts === true)
20
- return 'yes';
21
- if (settings.ai_merge_conflicts === false)
22
- return 'no';
23
- return null;
24
- }
25
- function saveAiMergePreference(useAi) {
26
- const settingsDir = path.join(process.env['HOME'] ?? '', '.webpieces');
27
- const settingsFile = path.join(settingsDir, 'settings.json');
28
- fs.mkdirSync(settingsDir, { recursive: true });
29
- let settings = {};
30
- if (fs.existsSync(settingsFile)) {
31
- settings = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
32
- }
33
- settings.ai_merge_conflicts = useAi;
34
- fs.writeFileSync(settingsFile, JSON.stringify(settings, null, 2) + '\n');
35
- }
36
- function askQuestion(rl, question) {
37
- return new Promise((resolve) => {
38
- rl.question(question, resolve);
39
- });
40
- }
41
- function saveConflictContext(conflictedFiles, mergeDir, forkPoint, featureHead, mainHead) {
42
- for (const file of conflictedFiles) {
43
- const safePath = file.replace(/\//g, '__');
44
- const fileDir = path.join(mergeDir, `updatemain-${safePath}`);
45
- fs.mkdirSync(fileDir, { recursive: true });
46
- const forkContent = (0, child_process_1.spawnSync)('git', ['show', `${forkPoint}:${file}`], { encoding: 'utf8' });
47
- fs.writeFileSync(path.join(fileDir, 'A-forkpoint.txt'), forkContent.status === 0 ? (forkContent.stdout ?? '') : '(file did not exist)\n');
48
- const featureContent = (0, child_process_1.spawnSync)('git', ['show', `${featureHead}:${file}`], { encoding: 'utf8' });
49
- fs.writeFileSync(path.join(fileDir, 'B-feature.txt'), featureContent.status === 0 ? (featureContent.stdout ?? '') : '(file did not exist)\n');
50
- const mainContent = (0, child_process_1.spawnSync)('git', ['show', `${mainHead}:${file}`], { encoding: 'utf8' });
51
- fs.writeFileSync(path.join(fileDir, 'C-main.txt'), mainContent.status === 0 ? (mainContent.stdout ?? '') : '(file did not exist)\n');
52
- const baResult = (0, child_process_1.spawnSync)('git', ['diff', forkPoint, featureHead, '--', file], { encoding: 'utf8' });
53
- fs.writeFileSync(path.join(fileDir, 'B-A.diff'), baResult.stdout ?? '');
54
- const caResult = (0, child_process_1.spawnSync)('git', ['diff', forkPoint, mainHead, '--', file], { encoding: 'utf8' });
55
- fs.writeFileSync(path.join(fileDir, 'C-A.diff'), caResult.stdout ?? '');
56
- }
57
- }
58
- async function waitForCleanCommit(rl, prompt) {
59
- let committed = false;
60
- while (!committed) {
61
- const ans = await askQuestion(rl, prompt);
62
- process.stdout.write('\n');
63
- if (ans.toLowerCase() === 'y') {
64
- const isClean = (0, child_process_1.spawnSync)('git', ['diff-index', '--quiet', 'HEAD', '--']).status === 0;
65
- if (isClean) {
66
- committed = true;
67
- }
68
- else {
69
- process.stdout.write('❌ You still have uncommitted changes\n\n');
70
- }
71
- }
72
- }
73
- }
74
- async function resolveAiMerge(rl, repoRoot, mergeDir) {
75
- process.stdout.write('\n' + SEP + '🤖 Calling AI to Resolve Conflicts\n' + SEP + '\n');
76
- (0, child_process_1.spawnSync)('claude', [
77
- '--allowed-tools', 'Edit Write Read Bash Glob Grep',
78
- '--append-system-prompt',
79
- 'Read .claude/commands/wp-merge.md and follow ALL instructions in that file to resolve the merge conflicts.',
80
- 'Start resolving the merge conflicts now.',
81
- ], { stdio: 'inherit', cwd: repoRoot });
82
- process.stdout.write('\n' + SEP + '✅ AI Merge Summary ✅\n' + SEP + '\n');
83
- process.stdout.write('Review what I did before committing:\n');
84
- process.stdout.write(" 1. Read each file's resolution details BELOW (quick read)\n");
85
- process.stdout.write(' 2. Diff each file in your IDE making sure AI did nothing extra\n');
86
- process.stdout.write(' 3. Delete any remaining A/B/C comment blocks in the code\n\n');
87
- process.stdout.write(`Full merge context available in: ${mergeDir}\n\n`);
88
- const mergeSummaryFile = path.join(mergeDir, 'merge-summary.md');
89
- if (fs.existsSync(mergeSummaryFile)) {
90
- process.stdout.write(fs.readFileSync(mergeSummaryFile, 'utf8'));
91
- }
92
- else {
93
- process.stdout.write('ℹ️ No merge summary file was generated by AI.\n');
94
- process.stdout.write(` (Expected: ${mergeSummaryFile})\n`);
95
- }
96
- process.stdout.write('\n' + SEP + '⚠️ IMPORTANT: SCROLL UP to AI Merge Summary section\n' + SEP + '\n');
97
- process.stdout.write('When done reviewing, run:\n\n git add -A && git commit -m "Merge main into feature branch"\n\n');
98
- await waitForCleanCommit(rl, 'Have you scrolled up to ✅ AI Merge Summary ✅ and done a quick read? Did you commit it per instructions? (y/n) ');
99
- fs.writeFileSync(path.join(mergeDir, 'conflicts-resolved'), '');
100
- process.stdout.write('\n' + SEP);
101
- }
102
- async function resolveManualMerge(rl, mergeDir) {
103
- process.stdout.write('\n' + SEP + '🛠️ Manual Merge Required\n' + SEP + '\n');
104
- let committed = false;
105
- while (!committed) {
106
- process.stdout.write('Please resolve conflicts manually\n');
107
- process.stdout.write(`Merge context available in: ${mergeDir}\n\n`);
108
- const ans = await askQuestion(rl, 'Are you done merging and committing? (y/n) ');
109
- process.stdout.write('\n');
110
- if (ans.toLowerCase() === 'y') {
111
- const isClean = (0, child_process_1.spawnSync)('git', ['diff-index', '--quiet', 'HEAD', '--']).status === 0;
112
- if (isClean) {
113
- committed = true;
114
- }
115
- else {
116
- process.stdout.write('❌ You still have uncommitted changes\n\n');
117
- }
118
- }
119
- }
120
- fs.writeFileSync(path.join(mergeDir, 'conflicts-resolved'), '');
121
- }
122
- async function handleConflicts(currentBranch, mergeDir, hashes, rl, repoRoot) {
123
- process.stdout.write('\n' + SEP + '⚠️ Conflicts Detected\n' + SEP + '\n');
124
- process.stdout.write('Conflicting files:\n');
125
- const conflictedFilesRaw = (0, child_process_1.execSync)('git diff --name-only --diff-filter=U', { encoding: 'utf8' }).trim();
126
- process.stdout.write(conflictedFilesRaw + '\n\n');
127
- fs.writeFileSync(path.join(mergeDir, 'updatemain-conflicted-files.txt'), conflictedFilesRaw + '\n');
128
- const conflictedFiles = conflictedFilesRaw.split('\n').filter((f) => f.trim() !== '');
129
- saveConflictContext(conflictedFiles, mergeDir, hashes.hashForkPoint, hashes.hashFeatureHead, hashes.hashMainHead);
130
- process.stdout.write(`✅ Merge context saved to: ${mergeDir}\n\n`);
131
- const settingsFile = path.join(process.env['HOME'] ?? '', '.webpieces', 'settings.json');
132
- const savedPref = getAiMergePreference();
133
- let useAi;
134
- if (savedPref !== null) {
135
- useAi = savedPref === 'yes';
136
- process.stdout.write(`Using saved preference: ${useAi ? 'AI merge' : 'Manual merge'} (from ${settingsFile})\n`);
137
- process.stdout.write(`To change, edit ${settingsFile} and set "ai_merge_conflicts"\n\n`);
138
- }
139
- else {
140
- process.stdout.write(SEP + `⚠️ Your choice will be saved to: ${settingsFile}\n` + ' You can edit this file later to change your preference.\n' + SEP + '\n');
141
- const answer = await askQuestion(rl, 'Would you like AI to help resolve conflicts? (y/n) ');
142
- process.stdout.write('\n');
143
- useAi = answer.toLowerCase() === 'y';
144
- saveAiMergePreference(useAi);
145
- process.stdout.write(`✅ Saved preference: ${useAi ? 'AI merge' : 'Manual merge'}\n\n`);
146
- }
147
- if (useAi) {
148
- await resolveAiMerge(rl, repoRoot, mergeDir);
149
- }
150
- else {
151
- await resolveManualMerge(rl, mergeDir);
152
- }
153
- void currentBranch;
154
- }
155
- function printFinalSummary(currentBranch, backupBranch, prNumber, mergeDir, hasRemote) {
156
- process.stdout.write('\n' + SEP);
157
- if (hasRemote) {
158
- process.stdout.write(prNumber ? `✅ Successfully Updated PR #${prNumber}\n` : '✅ Successfully Updated Remote Branch\n');
159
- }
160
- else {
161
- process.stdout.write('✅ Branch Updated from Main\n');
162
- }
163
- process.stdout.write(SEP + '\n📋 Summary:\n');
164
- process.stdout.write(` Branch: ${currentBranch}\n`);
165
- if (hasRemote && prNumber) {
166
- process.stdout.write(` PR: #${prNumber}\n`);
167
- }
168
- else if (!hasRemote) {
169
- process.stdout.write(' Base: main (latest)\n');
170
- }
171
- else {
172
- process.stdout.write(' PR: (none found - create with gh pr create)\n');
173
- }
174
- process.stdout.write(` Backup: ${backupBranch}\n`);
175
- process.stdout.write(` Merge context: ${mergeDir}\n`);
176
- process.stdout.write('\nNext steps:\n');
177
- if (hasRemote) {
178
- process.stdout.write(' 1. Review changes on GitHub\n');
179
- process.stdout.write(' 2. Continue development or create more commits\n');
180
- }
181
- else {
182
- process.stdout.write(' 1. Test your changes\n');
183
- process.stdout.write(' 2. Create PR with: gh pr create\n');
184
- }
185
- process.stdout.write(` 3. Delete old backup when safe: git branch -D ${backupBranch}\n\n`);
186
- process.stdout.write(SEP);
187
- }
188
- function createBackup(currentBranch) {
189
- process.stdout.write('\n' + SEP + '💾 Creating Incremental Backup\n' + SEP + '\n');
190
- let n = 1;
191
- while ((0, child_process_1.spawnSync)('git', ['show-ref', '--verify', '--quiet', `refs/heads/${currentBranch}Backup${n}`]).status === 0) {
192
- n += 1;
193
- }
194
- const backupBranch = `${currentBranch}Backup${n}`;
195
- process.stdout.write(`Creating backup: ${backupBranch}\n`);
196
- (0, child_process_1.spawnSync)('git', ['checkout', '-b', backupBranch], { stdio: 'inherit' });
197
- (0, child_process_1.spawnSync)('git', ['checkout', currentBranch], { stdio: 'inherit' });
198
- process.stdout.write(`✅ Backup created: ${backupBranch}\n\n`);
199
- return backupBranch;
200
- }
201
- async function finalizeBranch(currentBranch, squashBranch, backupBranch, prNumber, mergeDir) {
202
- process.stdout.write('\n' + SEP + '🗑️ Cleaning Up Old Branch\n' + SEP + '\n');
203
- process.stdout.write(`Deleting local branch: ${currentBranch} (backed up as ${backupBranch})\n`);
204
- (0, child_process_1.spawnSync)('git', ['branch', '-D', currentBranch], { stdio: 'inherit' });
205
- process.stdout.write('\n');
206
- const remoteExists = (0, child_process_1.spawnSync)('git', ['ls-remote', '--exit-code', '--heads', 'origin', currentBranch]).status === 0;
207
- if (remoteExists) {
208
- process.stdout.write(SEP + (prNumber ? `🔍 Updating Existing PR #${prNumber}\n` : '🔍 Updating Remote Branch (no PR found)\n') + SEP + '\n');
209
- if (prNumber) {
210
- process.stdout.write(`✅ Updating PR #${prNumber} with squashed changes\n`);
211
- }
212
- else {
213
- process.stdout.write('⚠️ Remote branch exists but no PR found (PR check may have failed)\n Syncing remote branch anyway...\n');
214
- }
215
- process.stdout.write(`\nForce pushing ${squashBranch} to origin/${currentBranch}...\n`);
216
- (0, child_process_1.spawnSync)('git', ['push', '-u', '--force-with-lease', 'origin', `${squashBranch}:${currentBranch}`], { stdio: 'inherit' });
217
- (0, child_process_1.spawnSync)('git', ['checkout', squashBranch], { stdio: 'inherit' });
218
- (0, child_process_1.spawnSync)('git', ['branch', '-m', currentBranch], { stdio: 'inherit' });
219
- }
220
- else {
221
- process.stdout.write(SEP + '📝 No Remote Branch to Update\n' + SEP + '\n');
222
- (0, child_process_1.spawnSync)('git', ['checkout', squashBranch], { stdio: 'inherit' });
223
- (0, child_process_1.spawnSync)('git', ['branch', '-m', currentBranch], { stdio: 'inherit' });
224
- process.stdout.write(`ℹ️ No remote branch found for ${currentBranch} (local only)\n\n`);
225
- }
226
- printFinalSummary(currentBranch, backupBranch, prNumber, mergeDir, remoteExists);
227
- }
228
- async function main() {
229
- const currentBranch = (0, child_process_1.execSync)('git branch --show-current', { encoding: 'utf8' }).trim();
230
- const featureName = (0, git_readAiBranchName_1.getFeatureName)();
231
- const repoRoot = (0, child_process_1.execSync)('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();
232
- const mergeDir = path.join(repoRoot, 'webpiecesTmp', `merge-${featureName}`);
233
- fs.mkdirSync(mergeDir, { recursive: true });
234
- process.stdout.write('\n' + SEP + '🔄 Squash-Merge Workflow\n' + SEP + '\n');
235
- process.stdout.write('Gathering merge context...\n');
236
- await (0, git_gatherInfo_1.main)();
237
- const hashes = JSON.parse(fs.readFileSync(path.join(mergeDir, 'updatemain-hashes.json'), 'utf8'));
238
- process.stdout.write('\nChecking for existing PR...\n');
239
- const prResult = (0, child_process_1.spawnSync)('gh', ['pr', 'list', '--head', currentBranch, '--json', 'number', '--jq', '.[0].number'], { encoding: 'utf8' });
240
- const prNumber = prResult.status === 0 ? (prResult.stdout ?? '').trim() : '';
241
- process.stdout.write(prNumber ? `✅ Found existing PR #${prNumber} (will be updated after merge)\n\n` : 'ℹ️ No existing PR found (you can create one later with gh pr create)\n\n');
242
- const backupBranch = createBackup(currentBranch);
243
- process.stdout.write(SEP + '🔄 Creating Temporary Squash Branch\n' + SEP + '\n');
244
- const squashBranch = `${currentBranch}Squash`;
245
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
246
- if ((0, child_process_1.spawnSync)('git', ['show-ref', '--verify', '--quiet', `refs/heads/${squashBranch}`]).status === 0) {
247
- process.stdout.write(`⚠️ Found existing ${squashBranch} from previous run\n`);
248
- const answer = await askQuestion(rl, 'Delete and start fresh? (y/n) ');
249
- process.stdout.write('\n');
250
- if (answer.toLowerCase() === 'y') {
251
- (0, child_process_1.spawnSync)('git', ['branch', '-D', squashBranch], { stdio: 'inherit' });
252
- }
253
- else {
254
- process.stdout.write('❌ Aborting. Please clean up manually.\n');
255
- rl.close();
256
- process.exit(1);
257
- }
258
- }
259
- process.stdout.write('Updating local main branch...\n');
260
- (0, child_process_1.spawnSync)('git', ['checkout', 'main'], { stdio: 'inherit' });
261
- (0, child_process_1.spawnSync)('git', ['pull', 'origin', 'main'], { stdio: 'inherit' });
262
- process.stdout.write(`Creating new branch: ${squashBranch} from main...\n\n`);
263
- (0, child_process_1.spawnSync)('git', ['checkout', '-b', squashBranch], { stdio: 'inherit' });
264
- process.stdout.write(SEP + `🔀 Squash Merging ${currentBranch}\n` + SEP + '\n');
265
- const mergeResult = (0, child_process_1.spawnSync)('git', ['merge', '--squash', currentBranch], { stdio: 'inherit' });
266
- if (mergeResult.status === 0) {
267
- process.stdout.write('\n✅ Squash merge successful (no conflicts)\n\n');
268
- const nothingStaged = (0, child_process_1.spawnSync)('git', ['diff-index', '--quiet', '--cached', 'HEAD', '--']).status === 0;
269
- if (nothingStaged) {
270
- process.stdout.write('ℹ️ Branch already up-to-date with main (nothing to merge)\n');
271
- }
272
- else {
273
- (0, child_process_1.spawnSync)('git', ['commit', '-m', `Squash merge of ${currentBranch}`], { stdio: 'inherit' });
274
- }
275
- }
276
- else {
277
- await handleConflicts(currentBranch, mergeDir, hashes, rl, repoRoot);
278
- }
279
- rl.close();
280
- await finalizeBranch(currentBranch, squashBranch, backupBranch, prNumber, mergeDir);
281
- await (0, cleanTmp_1.main)();
282
- }
283
- if (require.main === module) {
284
- main().catch((err) => {
285
- const message = err instanceof Error ? err.message : String(err);
286
- process.stderr.write(message + '\n');
287
- process.exit(1);
288
- });
289
- }
290
- //# sourceMappingURL=git-updateFromMain.js.map