moflo 4.8.19 → 4.8.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/guidance/shipped/moflo.md +45 -0
- package/.claude/helpers/statusline.cjs +1 -1
- package/.claude/workflow-state.json +9 -0
- package/package.json +2 -2
- package/src/@claude-flow/cli/dist/src/init/statusline-generator.js +1 -1
- package/src/@claude-flow/cli/dist/src/services/agentic-flow-bridge.js +5 -3
- package/src/@claude-flow/cli/package.json +1 -1
- package/src/@claude-flow/memory/dist/agent-memory-scope.d.ts +131 -0
- package/src/@claude-flow/memory/dist/agent-memory-scope.js +223 -0
- package/src/@claude-flow/memory/dist/agent-memory-scope.test.d.ts +8 -0
- package/src/@claude-flow/memory/dist/agent-memory-scope.test.js +466 -0
- package/src/@claude-flow/memory/dist/agentdb-adapter.d.ts +165 -0
- package/src/@claude-flow/memory/dist/agentdb-adapter.js +806 -0
- package/src/@claude-flow/memory/dist/agentdb-backend.d.ts +212 -0
- package/src/@claude-flow/memory/dist/agentdb-backend.js +842 -0
- package/src/@claude-flow/memory/dist/agentdb-backend.test.d.ts +7 -0
- package/src/@claude-flow/memory/dist/agentdb-backend.test.js +258 -0
- package/src/@claude-flow/memory/dist/application/commands/delete-memory.command.d.ts +65 -0
- package/src/@claude-flow/memory/dist/application/commands/delete-memory.command.js +129 -0
- package/src/@claude-flow/memory/dist/application/commands/store-memory.command.d.ts +48 -0
- package/src/@claude-flow/memory/dist/application/commands/store-memory.command.js +72 -0
- package/src/@claude-flow/memory/dist/application/index.d.ts +12 -0
- package/src/@claude-flow/memory/dist/application/index.js +15 -0
- package/src/@claude-flow/memory/dist/application/queries/search-memory.query.d.ts +72 -0
- package/src/@claude-flow/memory/dist/application/queries/search-memory.query.js +143 -0
- package/src/@claude-flow/memory/dist/application/services/memory-application-service.d.ts +121 -0
- package/src/@claude-flow/memory/dist/application/services/memory-application-service.js +190 -0
- package/src/@claude-flow/memory/dist/auto-memory-bridge.d.ts +226 -0
- package/src/@claude-flow/memory/dist/auto-memory-bridge.js +709 -0
- package/src/@claude-flow/memory/dist/auto-memory-bridge.test.d.ts +8 -0
- package/src/@claude-flow/memory/dist/auto-memory-bridge.test.js +757 -0
- package/src/@claude-flow/memory/dist/benchmark.test.d.ts +2 -0
- package/src/@claude-flow/memory/dist/benchmark.test.js +277 -0
- package/src/@claude-flow/memory/dist/cache-manager.d.ts +134 -0
- package/src/@claude-flow/memory/dist/cache-manager.js +407 -0
- package/src/@claude-flow/memory/dist/controller-registry.d.ts +216 -0
- package/src/@claude-flow/memory/dist/controller-registry.js +893 -0
- package/src/@claude-flow/memory/dist/controller-registry.test.d.ts +14 -0
- package/src/@claude-flow/memory/dist/controller-registry.test.js +593 -0
- package/src/@claude-flow/memory/dist/database-provider.d.ts +87 -0
- package/src/@claude-flow/memory/dist/database-provider.js +372 -0
- package/src/@claude-flow/memory/dist/database-provider.test.d.ts +7 -0
- package/src/@claude-flow/memory/dist/database-provider.test.js +287 -0
- package/src/@claude-flow/memory/dist/domain/entities/memory-entry.d.ts +143 -0
- package/src/@claude-flow/memory/dist/domain/entities/memory-entry.js +226 -0
- package/src/@claude-flow/memory/dist/domain/index.d.ts +11 -0
- package/src/@claude-flow/memory/dist/domain/index.js +12 -0
- package/src/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.d.ts +102 -0
- package/src/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.js +11 -0
- package/src/@claude-flow/memory/dist/domain/services/memory-domain-service.d.ts +105 -0
- package/src/@claude-flow/memory/dist/domain/services/memory-domain-service.js +297 -0
- package/src/@claude-flow/memory/dist/hnsw-index.d.ts +111 -0
- package/src/@claude-flow/memory/dist/hnsw-index.js +781 -0
- package/src/@claude-flow/memory/dist/hnsw-lite.d.ts +23 -0
- package/src/@claude-flow/memory/dist/hnsw-lite.js +168 -0
- package/src/@claude-flow/memory/dist/index.d.ts +204 -0
- package/src/@claude-flow/memory/dist/index.js +358 -0
- package/src/@claude-flow/memory/dist/infrastructure/index.d.ts +17 -0
- package/src/@claude-flow/memory/dist/infrastructure/index.js +16 -0
- package/src/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.d.ts +66 -0
- package/src/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.js +409 -0
- package/src/@claude-flow/memory/dist/learning-bridge.d.ts +137 -0
- package/src/@claude-flow/memory/dist/learning-bridge.js +335 -0
- package/src/@claude-flow/memory/dist/learning-bridge.test.d.ts +8 -0
- package/src/@claude-flow/memory/dist/learning-bridge.test.js +578 -0
- package/src/@claude-flow/memory/dist/memory-graph.d.ts +100 -0
- package/src/@claude-flow/memory/dist/memory-graph.js +333 -0
- package/src/@claude-flow/memory/dist/memory-graph.test.d.ts +8 -0
- package/src/@claude-flow/memory/dist/memory-graph.test.js +609 -0
- package/src/@claude-flow/memory/dist/migration.d.ts +68 -0
- package/src/@claude-flow/memory/dist/migration.js +513 -0
- package/src/@claude-flow/memory/dist/persistent-sona.d.ts +144 -0
- package/src/@claude-flow/memory/dist/persistent-sona.js +332 -0
- package/src/@claude-flow/memory/dist/query-builder.d.ts +211 -0
- package/src/@claude-flow/memory/dist/query-builder.js +438 -0
- package/src/@claude-flow/memory/dist/rvf-backend.d.ts +51 -0
- package/src/@claude-flow/memory/dist/rvf-backend.js +481 -0
- package/src/@claude-flow/memory/dist/rvf-learning-store.d.ts +139 -0
- package/src/@claude-flow/memory/dist/rvf-learning-store.js +295 -0
- package/src/@claude-flow/memory/dist/rvf-migration.d.ts +45 -0
- package/src/@claude-flow/memory/dist/rvf-migration.js +234 -0
- package/src/@claude-flow/memory/dist/sqljs-backend.d.ts +127 -0
- package/src/@claude-flow/memory/dist/sqljs-backend.js +600 -0
- package/src/@claude-flow/memory/dist/types.d.ts +484 -0
- package/src/@claude-flow/memory/dist/types.js +58 -0
- package/src/@claude-flow/shared/dist/core/config/defaults.d.ts +41 -0
- package/src/@claude-flow/shared/dist/core/config/defaults.js +186 -0
- package/src/@claude-flow/shared/dist/core/config/index.d.ts +8 -0
- package/src/@claude-flow/shared/dist/core/config/index.js +12 -0
- package/src/@claude-flow/shared/dist/core/config/loader.d.ts +45 -0
- package/src/@claude-flow/shared/dist/core/config/loader.js +222 -0
- package/src/@claude-flow/shared/dist/core/config/schema.d.ts +1134 -0
- package/src/@claude-flow/shared/dist/core/config/schema.js +158 -0
- package/src/@claude-flow/shared/dist/core/config/validator.d.ts +92 -0
- package/src/@claude-flow/shared/dist/core/config/validator.js +147 -0
- package/src/@claude-flow/shared/dist/core/event-bus.d.ts +31 -0
- package/src/@claude-flow/shared/dist/core/event-bus.js +197 -0
- package/src/@claude-flow/shared/dist/core/index.d.ts +15 -0
- package/src/@claude-flow/shared/dist/core/index.js +19 -0
- package/src/@claude-flow/shared/dist/core/interfaces/agent.interface.d.ts +200 -0
- package/src/@claude-flow/shared/dist/core/interfaces/agent.interface.js +6 -0
- package/src/@claude-flow/shared/dist/core/interfaces/coordinator.interface.d.ts +310 -0
- package/src/@claude-flow/shared/dist/core/interfaces/coordinator.interface.js +7 -0
- package/src/@claude-flow/shared/dist/core/interfaces/event.interface.d.ts +224 -0
- package/src/@claude-flow/shared/dist/core/interfaces/event.interface.js +46 -0
- package/src/@claude-flow/shared/dist/core/interfaces/index.d.ts +10 -0
- package/src/@claude-flow/shared/dist/core/interfaces/index.js +15 -0
- package/src/@claude-flow/shared/dist/core/interfaces/memory.interface.d.ts +298 -0
- package/src/@claude-flow/shared/dist/core/interfaces/memory.interface.js +7 -0
- package/src/@claude-flow/shared/dist/core/interfaces/task.interface.d.ts +185 -0
- package/src/@claude-flow/shared/dist/core/interfaces/task.interface.js +6 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/event-coordinator.d.ts +35 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/event-coordinator.js +101 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/health-monitor.d.ts +60 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/health-monitor.js +166 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/index.d.ts +46 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/index.js +64 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/lifecycle-manager.d.ts +56 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/lifecycle-manager.js +195 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/session-manager.d.ts +83 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/session-manager.js +193 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/task-manager.d.ts +49 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/task-manager.js +253 -0
- package/src/@claude-flow/shared/dist/events/domain-events.d.ts +282 -0
- package/src/@claude-flow/shared/dist/events/domain-events.js +165 -0
- package/src/@claude-flow/shared/dist/events/event-store.d.ts +126 -0
- package/src/@claude-flow/shared/dist/events/event-store.js +432 -0
- package/src/@claude-flow/shared/dist/events/event-store.test.d.ts +8 -0
- package/src/@claude-flow/shared/dist/events/event-store.test.js +297 -0
- package/src/@claude-flow/shared/dist/events/example-usage.d.ts +10 -0
- package/src/@claude-flow/shared/dist/events/example-usage.js +193 -0
- package/src/@claude-flow/shared/dist/events/index.d.ts +21 -0
- package/src/@claude-flow/shared/dist/events/index.js +22 -0
- package/src/@claude-flow/shared/dist/events/projections.d.ts +177 -0
- package/src/@claude-flow/shared/dist/events/projections.js +421 -0
- package/src/@claude-flow/shared/dist/events/rvf-event-log.d.ts +82 -0
- package/src/@claude-flow/shared/dist/events/rvf-event-log.js +340 -0
- package/src/@claude-flow/shared/dist/events/state-reconstructor.d.ts +101 -0
- package/src/@claude-flow/shared/dist/events/state-reconstructor.js +263 -0
- package/src/@claude-flow/shared/dist/events.d.ts +80 -0
- package/src/@claude-flow/shared/dist/events.js +249 -0
- package/src/@claude-flow/shared/dist/hooks/example-usage.d.ts +42 -0
- package/src/@claude-flow/shared/dist/hooks/example-usage.js +351 -0
- package/src/@claude-flow/shared/dist/hooks/executor.d.ts +100 -0
- package/src/@claude-flow/shared/dist/hooks/executor.js +267 -0
- package/src/@claude-flow/shared/dist/hooks/hooks.test.d.ts +9 -0
- package/src/@claude-flow/shared/dist/hooks/hooks.test.js +322 -0
- package/src/@claude-flow/shared/dist/hooks/index.d.ts +52 -0
- package/src/@claude-flow/shared/dist/hooks/index.js +51 -0
- package/src/@claude-flow/shared/dist/hooks/registry.d.ts +133 -0
- package/src/@claude-flow/shared/dist/hooks/registry.js +277 -0
- package/src/@claude-flow/shared/dist/hooks/safety/bash-safety.d.ts +105 -0
- package/src/@claude-flow/shared/dist/hooks/safety/bash-safety.js +481 -0
- package/src/@claude-flow/shared/dist/hooks/safety/file-organization.d.ts +144 -0
- package/src/@claude-flow/shared/dist/hooks/safety/file-organization.js +328 -0
- package/src/@claude-flow/shared/dist/hooks/safety/git-commit.d.ts +158 -0
- package/src/@claude-flow/shared/dist/hooks/safety/git-commit.js +450 -0
- package/src/@claude-flow/shared/dist/hooks/safety/index.d.ts +17 -0
- package/src/@claude-flow/shared/dist/hooks/safety/index.js +17 -0
- package/src/@claude-flow/shared/dist/hooks/session-hooks.d.ts +234 -0
- package/src/@claude-flow/shared/dist/hooks/session-hooks.js +334 -0
- package/src/@claude-flow/shared/dist/hooks/task-hooks.d.ts +163 -0
- package/src/@claude-flow/shared/dist/hooks/task-hooks.js +326 -0
- package/src/@claude-flow/shared/dist/hooks/types.d.ts +267 -0
- package/src/@claude-flow/shared/dist/hooks/types.js +62 -0
- package/src/@claude-flow/shared/dist/hooks/verify-exports.test.d.ts +9 -0
- package/src/@claude-flow/shared/dist/hooks/verify-exports.test.js +93 -0
- package/src/@claude-flow/shared/dist/index.d.ts +20 -0
- package/src/@claude-flow/shared/dist/index.js +50 -0
- package/src/@claude-flow/shared/dist/mcp/connection-pool.d.ts +98 -0
- package/src/@claude-flow/shared/dist/mcp/connection-pool.js +364 -0
- package/src/@claude-flow/shared/dist/mcp/index.d.ts +69 -0
- package/src/@claude-flow/shared/dist/mcp/index.js +84 -0
- package/src/@claude-flow/shared/dist/mcp/server.d.ts +166 -0
- package/src/@claude-flow/shared/dist/mcp/server.js +593 -0
- package/src/@claude-flow/shared/dist/mcp/session-manager.d.ts +136 -0
- package/src/@claude-flow/shared/dist/mcp/session-manager.js +335 -0
- package/src/@claude-flow/shared/dist/mcp/tool-registry.d.ts +178 -0
- package/src/@claude-flow/shared/dist/mcp/tool-registry.js +439 -0
- package/src/@claude-flow/shared/dist/mcp/transport/http.d.ts +104 -0
- package/src/@claude-flow/shared/dist/mcp/transport/http.js +476 -0
- package/src/@claude-flow/shared/dist/mcp/transport/index.d.ts +102 -0
- package/src/@claude-flow/shared/dist/mcp/transport/index.js +238 -0
- package/src/@claude-flow/shared/dist/mcp/transport/stdio.d.ts +104 -0
- package/src/@claude-flow/shared/dist/mcp/transport/stdio.js +263 -0
- package/src/@claude-flow/shared/dist/mcp/transport/websocket.d.ts +133 -0
- package/src/@claude-flow/shared/dist/mcp/transport/websocket.js +396 -0
- package/src/@claude-flow/shared/dist/mcp/types.d.ts +438 -0
- package/src/@claude-flow/shared/dist/mcp/types.js +54 -0
- package/src/@claude-flow/shared/dist/plugin-interface.d.ts +544 -0
- package/src/@claude-flow/shared/dist/plugin-interface.js +23 -0
- package/src/@claude-flow/shared/dist/plugin-loader.d.ts +139 -0
- package/src/@claude-flow/shared/dist/plugin-loader.js +434 -0
- package/src/@claude-flow/shared/dist/plugin-registry.d.ts +183 -0
- package/src/@claude-flow/shared/dist/plugin-registry.js +457 -0
- package/src/@claude-flow/shared/dist/plugins/index.d.ts +10 -0
- package/src/@claude-flow/shared/dist/plugins/index.js +10 -0
- package/src/@claude-flow/shared/dist/plugins/official/hive-mind-plugin.d.ts +106 -0
- package/src/@claude-flow/shared/dist/plugins/official/hive-mind-plugin.js +241 -0
- package/src/@claude-flow/shared/dist/plugins/official/index.d.ts +10 -0
- package/src/@claude-flow/shared/dist/plugins/official/index.js +10 -0
- package/src/@claude-flow/shared/dist/plugins/official/maestro-plugin.d.ts +121 -0
- package/src/@claude-flow/shared/dist/plugins/official/maestro-plugin.js +355 -0
- package/src/@claude-flow/shared/dist/plugins/types.d.ts +93 -0
- package/src/@claude-flow/shared/dist/plugins/types.js +9 -0
- package/src/@claude-flow/shared/dist/resilience/bulkhead.d.ts +105 -0
- package/src/@claude-flow/shared/dist/resilience/bulkhead.js +206 -0
- package/src/@claude-flow/shared/dist/resilience/circuit-breaker.d.ts +132 -0
- package/src/@claude-flow/shared/dist/resilience/circuit-breaker.js +233 -0
- package/src/@claude-flow/shared/dist/resilience/index.d.ts +19 -0
- package/src/@claude-flow/shared/dist/resilience/index.js +19 -0
- package/src/@claude-flow/shared/dist/resilience/rate-limiter.d.ts +168 -0
- package/src/@claude-flow/shared/dist/resilience/rate-limiter.js +314 -0
- package/src/@claude-flow/shared/dist/resilience/retry.d.ts +91 -0
- package/src/@claude-flow/shared/dist/resilience/retry.js +159 -0
- package/src/@claude-flow/shared/dist/security/index.d.ts +10 -0
- package/src/@claude-flow/shared/dist/security/index.js +12 -0
- package/src/@claude-flow/shared/dist/security/input-validation.d.ts +73 -0
- package/src/@claude-flow/shared/dist/security/input-validation.js +201 -0
- package/src/@claude-flow/shared/dist/security/secure-random.d.ts +92 -0
- package/src/@claude-flow/shared/dist/security/secure-random.js +142 -0
- package/src/@claude-flow/shared/dist/services/index.d.ts +7 -0
- package/src/@claude-flow/shared/dist/services/index.js +7 -0
- package/src/@claude-flow/shared/dist/services/v3-progress.service.d.ts +124 -0
- package/src/@claude-flow/shared/dist/services/v3-progress.service.js +402 -0
- package/src/@claude-flow/shared/dist/types/agent.types.d.ts +137 -0
- package/src/@claude-flow/shared/dist/types/agent.types.js +6 -0
- package/src/@claude-flow/shared/dist/types/index.d.ts +11 -0
- package/src/@claude-flow/shared/dist/types/index.js +17 -0
- package/src/@claude-flow/shared/dist/types/mcp.types.d.ts +266 -0
- package/src/@claude-flow/shared/dist/types/mcp.types.js +7 -0
- package/src/@claude-flow/shared/dist/types/memory.types.d.ts +236 -0
- package/src/@claude-flow/shared/dist/types/memory.types.js +7 -0
- package/src/@claude-flow/shared/dist/types/swarm.types.d.ts +186 -0
- package/src/@claude-flow/shared/dist/types/swarm.types.js +65 -0
- package/src/@claude-flow/shared/dist/types/task.types.d.ts +178 -0
- package/src/@claude-flow/shared/dist/types/task.types.js +32 -0
- package/src/@claude-flow/shared/dist/types.d.ts +197 -0
- package/src/@claude-flow/shared/dist/types.js +21 -0
- package/src/@claude-flow/shared/dist/utils/secure-logger.d.ts +69 -0
- package/src/@claude-flow/shared/dist/utils/secure-logger.js +208 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V3 File Organization Hook
|
|
3
|
+
*
|
|
4
|
+
* TypeScript conversion of V2 file-hook.sh.
|
|
5
|
+
* Enforces file organization, blocks writes to root folder,
|
|
6
|
+
* suggests proper directories, and recommends formatters.
|
|
7
|
+
*
|
|
8
|
+
* @module v3/shared/hooks/safety/file-organization
|
|
9
|
+
*/
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { HookEvent, HookPriority, } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* File type mapping to directories
|
|
14
|
+
*/
|
|
15
|
+
const FILE_TYPE_DIRECTORIES = [
|
|
16
|
+
// Test files (MUST come before source files - more specific patterns first)
|
|
17
|
+
{ pattern: /\.test\.(ts|tsx|js|jsx)$/, directories: ['tests/', '__tests__/', 'test/'], type: 'test file', blockRoot: true },
|
|
18
|
+
{ pattern: /\.spec\.(ts|tsx|js|jsx)$/, directories: ['tests/', '__tests__/', 'test/', 'spec/'], type: 'spec file', blockRoot: true },
|
|
19
|
+
{ pattern: /_test\.go$/, directories: ['tests/', 'test/'], type: 'Go test file', blockRoot: true },
|
|
20
|
+
{ pattern: /test_.*\.py$/, directories: ['tests/', 'test/'], type: 'Python test file', blockRoot: true },
|
|
21
|
+
{ pattern: /.*_test\.py$/, directories: ['tests/', 'test/'], type: 'Python test file', blockRoot: true },
|
|
22
|
+
// Source files
|
|
23
|
+
{ pattern: /\.(ts|tsx)$/, directories: ['src/', 'lib/'], type: 'TypeScript source', blockRoot: true },
|
|
24
|
+
{ pattern: /\.(js|jsx|mjs|cjs)$/, directories: ['src/', 'lib/', 'dist/'], type: 'JavaScript source', blockRoot: true },
|
|
25
|
+
{ pattern: /\.py$/, directories: ['src/', 'lib/', 'app/'], type: 'Python source', blockRoot: true },
|
|
26
|
+
{ pattern: /\.go$/, directories: ['cmd/', 'pkg/', 'internal/'], type: 'Go source', blockRoot: true },
|
|
27
|
+
{ pattern: /\.rs$/, directories: ['src/'], type: 'Rust source', blockRoot: true },
|
|
28
|
+
{ pattern: /\.java$/, directories: ['src/main/java/', 'src/'], type: 'Java source', blockRoot: true },
|
|
29
|
+
{ pattern: /\.rb$/, directories: ['lib/', 'app/'], type: 'Ruby source', blockRoot: true },
|
|
30
|
+
{ pattern: /\.php$/, directories: ['src/', 'app/'], type: 'PHP source', blockRoot: true },
|
|
31
|
+
{ pattern: /\.cs$/, directories: ['src/'], type: 'C# source', blockRoot: true },
|
|
32
|
+
{ pattern: /\.cpp?$/, directories: ['src/'], type: 'C/C++ source', blockRoot: true },
|
|
33
|
+
{ pattern: /\.swift$/, directories: ['Sources/'], type: 'Swift source', blockRoot: true },
|
|
34
|
+
{ pattern: /\.kt$/, directories: ['src/main/kotlin/', 'src/'], type: 'Kotlin source', blockRoot: true },
|
|
35
|
+
// Config files (usually allowed at root)
|
|
36
|
+
{ pattern: /\.(json|yaml|yml|toml)$/, directories: ['config/', './', 'configs/'], type: 'config file', blockRoot: false },
|
|
37
|
+
{ pattern: /\.(env|env\.[a-z]+)$/, directories: ['./'], type: 'environment file', blockRoot: false },
|
|
38
|
+
// Documentation
|
|
39
|
+
{ pattern: /\.md$/, directories: ['docs/', './'], type: 'Markdown documentation', blockRoot: false },
|
|
40
|
+
{ pattern: /\.rst$/, directories: ['docs/'], type: 'reStructuredText documentation', blockRoot: true },
|
|
41
|
+
{ pattern: /\.adoc$/, directories: ['docs/'], type: 'AsciiDoc documentation', blockRoot: true },
|
|
42
|
+
// Assets
|
|
43
|
+
{ pattern: /\.(css|scss|sass|less)$/, directories: ['styles/', 'src/styles/', 'assets/css/'], type: 'stylesheet', blockRoot: true },
|
|
44
|
+
{ pattern: /\.(png|jpg|jpeg|gif|svg|ico)$/, directories: ['assets/', 'public/', 'images/', 'static/'], type: 'image', blockRoot: true },
|
|
45
|
+
{ pattern: /\.(woff2?|ttf|otf|eot)$/, directories: ['assets/fonts/', 'fonts/', 'public/fonts/'], type: 'font', blockRoot: true },
|
|
46
|
+
// Scripts
|
|
47
|
+
{ pattern: /\.sh$/, directories: ['scripts/', 'bin/'], type: 'shell script', blockRoot: true },
|
|
48
|
+
{ pattern: /\.ps1$/, directories: ['scripts/', 'bin/'], type: 'PowerShell script', blockRoot: true },
|
|
49
|
+
// Data
|
|
50
|
+
{ pattern: /\.sql$/, directories: ['migrations/', 'db/', 'database/'], type: 'SQL file', blockRoot: true },
|
|
51
|
+
{ pattern: /\.csv$/, directories: ['data/', 'fixtures/', 'test/fixtures/'], type: 'CSV data', blockRoot: true },
|
|
52
|
+
];
|
|
53
|
+
/**
|
|
54
|
+
* Formatter recommendations by file extension
|
|
55
|
+
*/
|
|
56
|
+
const FORMATTERS = {
|
|
57
|
+
'.ts': { name: 'Prettier', command: 'prettier --write', configFile: '.prettierrc' },
|
|
58
|
+
'.tsx': { name: 'Prettier', command: 'prettier --write', configFile: '.prettierrc' },
|
|
59
|
+
'.js': { name: 'Prettier', command: 'prettier --write', configFile: '.prettierrc' },
|
|
60
|
+
'.jsx': { name: 'Prettier', command: 'prettier --write', configFile: '.prettierrc' },
|
|
61
|
+
'.json': { name: 'Prettier', command: 'prettier --write', configFile: '.prettierrc' },
|
|
62
|
+
'.md': { name: 'Prettier', command: 'prettier --write', configFile: '.prettierrc' },
|
|
63
|
+
'.yaml': { name: 'Prettier', command: 'prettier --write', configFile: '.prettierrc' },
|
|
64
|
+
'.yml': { name: 'Prettier', command: 'prettier --write', configFile: '.prettierrc' },
|
|
65
|
+
'.py': { name: 'Black', command: 'black', configFile: 'pyproject.toml' },
|
|
66
|
+
'.go': { name: 'gofmt', command: 'gofmt -w', configFile: undefined },
|
|
67
|
+
'.rs': { name: 'rustfmt', command: 'rustfmt', configFile: 'rustfmt.toml' },
|
|
68
|
+
'.java': { name: 'google-java-format', command: 'google-java-format -i', configFile: undefined },
|
|
69
|
+
'.rb': { name: 'RuboCop', command: 'rubocop -a', configFile: '.rubocop.yml' },
|
|
70
|
+
'.php': { name: 'PHP-CS-Fixer', command: 'php-cs-fixer fix', configFile: '.php-cs-fixer.php' },
|
|
71
|
+
'.cs': { name: 'dotnet-format', command: 'dotnet format', configFile: '.editorconfig' },
|
|
72
|
+
'.swift': { name: 'swift-format', command: 'swift-format -i', configFile: '.swift-format' },
|
|
73
|
+
'.kt': { name: 'ktlint', command: 'ktlint -F', configFile: '.editorconfig' },
|
|
74
|
+
'.css': { name: 'Prettier', command: 'prettier --write', configFile: '.prettierrc' },
|
|
75
|
+
'.scss': { name: 'Prettier', command: 'prettier --write', configFile: '.prettierrc' },
|
|
76
|
+
'.html': { name: 'Prettier', command: 'prettier --write', configFile: '.prettierrc' },
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Linter recommendations by file extension
|
|
80
|
+
*/
|
|
81
|
+
const LINTERS = {
|
|
82
|
+
'.ts': { name: 'ESLint', command: 'eslint --fix', configFile: '.eslintrc' },
|
|
83
|
+
'.tsx': { name: 'ESLint', command: 'eslint --fix', configFile: '.eslintrc' },
|
|
84
|
+
'.js': { name: 'ESLint', command: 'eslint --fix', configFile: '.eslintrc' },
|
|
85
|
+
'.jsx': { name: 'ESLint', command: 'eslint --fix', configFile: '.eslintrc' },
|
|
86
|
+
'.py': { name: 'Pylint', command: 'pylint', configFile: 'pylintrc' },
|
|
87
|
+
'.go': { name: 'golangci-lint', command: 'golangci-lint run', configFile: '.golangci.yml' },
|
|
88
|
+
'.rs': { name: 'Clippy', command: 'cargo clippy', configFile: 'Cargo.toml' },
|
|
89
|
+
'.rb': { name: 'RuboCop', command: 'rubocop', configFile: '.rubocop.yml' },
|
|
90
|
+
'.php': { name: 'PHPStan', command: 'phpstan analyse', configFile: 'phpstan.neon' },
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Naming convention checks
|
|
94
|
+
*/
|
|
95
|
+
const NAMING_CONVENTIONS = [
|
|
96
|
+
{ pattern: /^[a-z][a-z0-9-]*\.[a-z]+$/, convention: 'kebab-case', fileTypes: /\.(tsx?|jsx?|css|scss)$/ },
|
|
97
|
+
{ pattern: /^[a-z][a-z0-9_]*\.[a-z]+$/, convention: 'snake_case', fileTypes: /\.py$/ },
|
|
98
|
+
{ pattern: /^[a-z][a-z0-9_]*\.[a-z]+$/, convention: 'snake_case', fileTypes: /\.go$/ },
|
|
99
|
+
{ pattern: /^[A-Z][a-zA-Z0-9]*\.[a-z]+$/, convention: 'PascalCase', fileTypes: /\.(java|kt|cs)$/ },
|
|
100
|
+
];
|
|
101
|
+
/**
|
|
102
|
+
* File Organization Hook Manager
|
|
103
|
+
*/
|
|
104
|
+
export class FileOrganizationHook {
|
|
105
|
+
registry;
|
|
106
|
+
projectRoot = process.cwd();
|
|
107
|
+
constructor(registry) {
|
|
108
|
+
this.registry = registry;
|
|
109
|
+
this.registerHooks();
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Register file organization hooks
|
|
113
|
+
*/
|
|
114
|
+
registerHooks() {
|
|
115
|
+
// Pre-edit hook
|
|
116
|
+
this.registry.register(HookEvent.PreEdit, this.analyzeFileOperation.bind(this), HookPriority.High, { name: 'file-organization:pre-edit' });
|
|
117
|
+
// Pre-write hook
|
|
118
|
+
this.registry.register(HookEvent.PreWrite, this.analyzeFileOperation.bind(this), HookPriority.High, { name: 'file-organization:pre-write' });
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Analyze file operation for organization issues
|
|
122
|
+
*/
|
|
123
|
+
async analyzeFileOperation(context) {
|
|
124
|
+
const fileInfo = context.file;
|
|
125
|
+
if (!fileInfo) {
|
|
126
|
+
return this.createResult(false, []);
|
|
127
|
+
}
|
|
128
|
+
const filePath = fileInfo.path;
|
|
129
|
+
const fileName = path.basename(filePath);
|
|
130
|
+
const dirName = path.dirname(filePath);
|
|
131
|
+
const ext = path.extname(filePath);
|
|
132
|
+
const issues = [];
|
|
133
|
+
const warnings = [];
|
|
134
|
+
let blocked = false;
|
|
135
|
+
let blockReason;
|
|
136
|
+
let suggestedPath;
|
|
137
|
+
let suggestedDirectory;
|
|
138
|
+
// Check if writing to root folder
|
|
139
|
+
const isRootWrite = this.isRootDirectory(dirName);
|
|
140
|
+
const fileTypeInfo = this.getFileTypeInfo(fileName);
|
|
141
|
+
if (isRootWrite && fileTypeInfo?.blockRoot) {
|
|
142
|
+
blocked = true;
|
|
143
|
+
blockReason = `Source files should not be written to root folder. Suggested: ${fileTypeInfo.directories[0]}`;
|
|
144
|
+
suggestedDirectory = fileTypeInfo.directories[0];
|
|
145
|
+
suggestedPath = path.join(suggestedDirectory, fileName).replace(/\\/g, '/');
|
|
146
|
+
issues.push({
|
|
147
|
+
type: 'root-write',
|
|
148
|
+
severity: 'error',
|
|
149
|
+
description: `${fileTypeInfo.type} files should not be in the root directory`,
|
|
150
|
+
suggestedFix: `Move to ${suggestedDirectory}`,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// Check if file is in wrong directory
|
|
154
|
+
if (!isRootWrite && fileTypeInfo) {
|
|
155
|
+
const isInCorrectDir = fileTypeInfo.directories.some(dir => this.normalizePath(dirName).includes(this.normalizePath(dir)));
|
|
156
|
+
if (!isInCorrectDir) {
|
|
157
|
+
issues.push({
|
|
158
|
+
type: 'wrong-directory',
|
|
159
|
+
severity: 'warning',
|
|
160
|
+
description: `${fileTypeInfo.type} typically goes in: ${fileTypeInfo.directories.join(' or ')}`,
|
|
161
|
+
suggestedFix: `Consider moving to ${fileTypeInfo.directories[0]}`,
|
|
162
|
+
});
|
|
163
|
+
warnings.push(`File may be in wrong directory. Expected: ${fileTypeInfo.directories.join(' or ')}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Check naming convention
|
|
167
|
+
const namingIssue = this.checkNamingConvention(fileName, ext);
|
|
168
|
+
if (namingIssue) {
|
|
169
|
+
issues.push(namingIssue);
|
|
170
|
+
warnings.push(namingIssue.description);
|
|
171
|
+
}
|
|
172
|
+
// Get formatter recommendation
|
|
173
|
+
const formatter = this.getFormatterRecommendation(ext);
|
|
174
|
+
// Get linter recommendation
|
|
175
|
+
const linter = this.getLinterRecommendation(ext);
|
|
176
|
+
return {
|
|
177
|
+
success: true,
|
|
178
|
+
blocked,
|
|
179
|
+
blockReason,
|
|
180
|
+
suggestedPath,
|
|
181
|
+
suggestedDirectory,
|
|
182
|
+
formatter,
|
|
183
|
+
linter,
|
|
184
|
+
fileType: fileTypeInfo?.type,
|
|
185
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
186
|
+
issues: issues.length > 0 ? issues : undefined,
|
|
187
|
+
abort: blocked,
|
|
188
|
+
data: blocked ? undefined : {
|
|
189
|
+
file: {
|
|
190
|
+
...fileInfo,
|
|
191
|
+
path: suggestedPath || filePath,
|
|
192
|
+
},
|
|
193
|
+
metadata: {
|
|
194
|
+
formatter: formatter?.command,
|
|
195
|
+
linter: linter?.command,
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Check if directory is root
|
|
202
|
+
*/
|
|
203
|
+
isRootDirectory(dirName) {
|
|
204
|
+
const normalized = this.normalizePath(dirName);
|
|
205
|
+
return normalized === '.' ||
|
|
206
|
+
normalized === './' ||
|
|
207
|
+
normalized === '' ||
|
|
208
|
+
normalized === this.normalizePath(this.projectRoot);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Normalize path for comparison
|
|
212
|
+
*/
|
|
213
|
+
normalizePath(p) {
|
|
214
|
+
return p.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/$/, '');
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get file type information
|
|
218
|
+
*/
|
|
219
|
+
getFileTypeInfo(fileName) {
|
|
220
|
+
for (const info of FILE_TYPE_DIRECTORIES) {
|
|
221
|
+
if (info.pattern.test(fileName)) {
|
|
222
|
+
return {
|
|
223
|
+
directories: info.directories,
|
|
224
|
+
type: info.type,
|
|
225
|
+
blockRoot: info.blockRoot,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Check naming convention
|
|
233
|
+
*/
|
|
234
|
+
checkNamingConvention(fileName, ext) {
|
|
235
|
+
for (const rule of NAMING_CONVENTIONS) {
|
|
236
|
+
if (rule.fileTypes.test(ext)) {
|
|
237
|
+
const baseName = fileName.replace(ext, '');
|
|
238
|
+
if (!rule.pattern.test(fileName)) {
|
|
239
|
+
return {
|
|
240
|
+
type: 'naming-convention',
|
|
241
|
+
severity: 'info',
|
|
242
|
+
description: `File name may not follow ${rule.convention} convention`,
|
|
243
|
+
suggestedFix: `Consider renaming to follow ${rule.convention}`,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get formatter recommendation
|
|
252
|
+
*/
|
|
253
|
+
getFormatterRecommendation(ext) {
|
|
254
|
+
return FORMATTERS[ext];
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get linter recommendation
|
|
258
|
+
*/
|
|
259
|
+
getLinterRecommendation(ext) {
|
|
260
|
+
return LINTERS[ext];
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Create result object
|
|
264
|
+
*/
|
|
265
|
+
createResult(blocked, issues) {
|
|
266
|
+
return {
|
|
267
|
+
success: true,
|
|
268
|
+
blocked,
|
|
269
|
+
issues: issues.length > 0 ? issues : undefined,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Manually analyze a file path
|
|
274
|
+
*/
|
|
275
|
+
async analyze(filePath) {
|
|
276
|
+
const context = {
|
|
277
|
+
event: HookEvent.PreEdit,
|
|
278
|
+
timestamp: new Date(),
|
|
279
|
+
file: {
|
|
280
|
+
path: filePath,
|
|
281
|
+
operation: 'write',
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
return this.analyzeFileOperation(context);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get suggested directory for a file
|
|
288
|
+
*/
|
|
289
|
+
getSuggestedDirectory(fileName) {
|
|
290
|
+
const info = this.getFileTypeInfo(fileName);
|
|
291
|
+
return info?.directories[0] || null;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Check if a file path would be blocked
|
|
295
|
+
*/
|
|
296
|
+
wouldBlock(filePath) {
|
|
297
|
+
const fileName = path.basename(filePath);
|
|
298
|
+
const dirName = path.dirname(filePath);
|
|
299
|
+
const isRoot = this.isRootDirectory(dirName);
|
|
300
|
+
const info = this.getFileTypeInfo(fileName);
|
|
301
|
+
return isRoot && (info?.blockRoot ?? false);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Set project root directory
|
|
305
|
+
*/
|
|
306
|
+
setProjectRoot(root) {
|
|
307
|
+
this.projectRoot = root;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Get all formatter recommendations
|
|
311
|
+
*/
|
|
312
|
+
getAllFormatters() {
|
|
313
|
+
return { ...FORMATTERS };
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Get all linter recommendations
|
|
317
|
+
*/
|
|
318
|
+
getAllLinters() {
|
|
319
|
+
return { ...LINTERS };
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Create file organization hook
|
|
324
|
+
*/
|
|
325
|
+
export function createFileOrganizationHook(registry) {
|
|
326
|
+
return new FileOrganizationHook(registry);
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=file-organization.js.map
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V3 Git Commit Hook
|
|
3
|
+
*
|
|
4
|
+
* TypeScript conversion of V2 git-commit-hook.sh.
|
|
5
|
+
* Provides conventional commit formatting, JIRA ticket extraction,
|
|
6
|
+
* co-author addition, and commit message validation.
|
|
7
|
+
*
|
|
8
|
+
* @module v3/shared/hooks/safety/git-commit
|
|
9
|
+
*/
|
|
10
|
+
import { HookContext, HookResult } from '../types.js';
|
|
11
|
+
import { HookRegistry } from '../registry.js';
|
|
12
|
+
/**
|
|
13
|
+
* Git commit hook result
|
|
14
|
+
*/
|
|
15
|
+
export interface GitCommitResult extends HookResult {
|
|
16
|
+
/** Original commit message */
|
|
17
|
+
originalMessage: string;
|
|
18
|
+
/** Modified commit message */
|
|
19
|
+
modifiedMessage: string;
|
|
20
|
+
/** Detected commit type */
|
|
21
|
+
commitType?: CommitType;
|
|
22
|
+
/** Extracted ticket reference */
|
|
23
|
+
ticketReference?: string;
|
|
24
|
+
/** Whether co-author was added */
|
|
25
|
+
coAuthorAdded: boolean;
|
|
26
|
+
/** Validation issues */
|
|
27
|
+
validationIssues?: CommitValidationIssue[];
|
|
28
|
+
/** Suggestions for improvement */
|
|
29
|
+
suggestions?: string[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Commit type definition
|
|
33
|
+
*/
|
|
34
|
+
export type CommitType = 'feat' | 'fix' | 'docs' | 'style' | 'refactor' | 'perf' | 'test' | 'build' | 'ci' | 'chore' | 'revert';
|
|
35
|
+
/**
|
|
36
|
+
* Commit validation issue
|
|
37
|
+
*/
|
|
38
|
+
export interface CommitValidationIssue {
|
|
39
|
+
/** Issue type */
|
|
40
|
+
type: 'format' | 'length' | 'scope' | 'body' | 'breaking';
|
|
41
|
+
/** Issue severity */
|
|
42
|
+
severity: 'info' | 'warning' | 'error';
|
|
43
|
+
/** Issue description */
|
|
44
|
+
description: string;
|
|
45
|
+
/** Suggested fix */
|
|
46
|
+
suggestedFix?: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Co-author configuration
|
|
50
|
+
*/
|
|
51
|
+
interface CoAuthor {
|
|
52
|
+
name: string;
|
|
53
|
+
email: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Commit message configuration
|
|
57
|
+
*/
|
|
58
|
+
interface CommitConfig {
|
|
59
|
+
/** Maximum subject line length */
|
|
60
|
+
maxSubjectLength: number;
|
|
61
|
+
/** Maximum body line length */
|
|
62
|
+
maxBodyLength: number;
|
|
63
|
+
/** Require conventional commit format */
|
|
64
|
+
requireConventional: boolean;
|
|
65
|
+
/** Add co-author by default */
|
|
66
|
+
addCoAuthor: boolean;
|
|
67
|
+
/** Co-author to add */
|
|
68
|
+
coAuthor: CoAuthor;
|
|
69
|
+
/** Add Claude Code reference */
|
|
70
|
+
addClaudeReference: boolean;
|
|
71
|
+
/** Allowed scopes */
|
|
72
|
+
allowedScopes?: string[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Git Commit Hook Manager
|
|
76
|
+
*/
|
|
77
|
+
export declare class GitCommitHook {
|
|
78
|
+
private registry;
|
|
79
|
+
private config;
|
|
80
|
+
constructor(registry: HookRegistry, config?: Partial<CommitConfig>);
|
|
81
|
+
/**
|
|
82
|
+
* Register git commit hooks
|
|
83
|
+
*/
|
|
84
|
+
private registerHooks;
|
|
85
|
+
/**
|
|
86
|
+
* Handle pre-commit (when a git commit command is detected)
|
|
87
|
+
*/
|
|
88
|
+
handlePreCommit(context: HookContext): Promise<HookResult>;
|
|
89
|
+
/**
|
|
90
|
+
* Process commit message
|
|
91
|
+
*/
|
|
92
|
+
processCommitMessage(message: string, branchName?: string): Promise<GitCommitResult>;
|
|
93
|
+
/**
|
|
94
|
+
* Parse commit message into parts
|
|
95
|
+
*/
|
|
96
|
+
private parseMessage;
|
|
97
|
+
/**
|
|
98
|
+
* Detect commit type from message
|
|
99
|
+
*/
|
|
100
|
+
private detectCommitType;
|
|
101
|
+
/**
|
|
102
|
+
* Check if message has conventional commit prefix
|
|
103
|
+
*/
|
|
104
|
+
private hasConventionalPrefix;
|
|
105
|
+
/**
|
|
106
|
+
* Lowercase first letter of a string
|
|
107
|
+
*/
|
|
108
|
+
private lowercaseFirstLetter;
|
|
109
|
+
/**
|
|
110
|
+
* Extract ticket reference from branch name
|
|
111
|
+
*/
|
|
112
|
+
private extractTicket;
|
|
113
|
+
/**
|
|
114
|
+
* Add ticket reference to message
|
|
115
|
+
*/
|
|
116
|
+
private addTicketReference;
|
|
117
|
+
/**
|
|
118
|
+
* Validate conventional commit format
|
|
119
|
+
*/
|
|
120
|
+
private validateConventional;
|
|
121
|
+
/**
|
|
122
|
+
* Process commit message manually
|
|
123
|
+
*/
|
|
124
|
+
process(message: string, branchName?: string): Promise<GitCommitResult>;
|
|
125
|
+
/**
|
|
126
|
+
* Format a commit message with heredoc-style for git
|
|
127
|
+
*/
|
|
128
|
+
formatForGit(message: string): string;
|
|
129
|
+
/**
|
|
130
|
+
* Generate a commit command with formatted message
|
|
131
|
+
*/
|
|
132
|
+
generateCommitCommand(message: string): string;
|
|
133
|
+
/**
|
|
134
|
+
* Get commit type description
|
|
135
|
+
*/
|
|
136
|
+
getCommitTypeDescription(type: CommitType): string;
|
|
137
|
+
/**
|
|
138
|
+
* Get all available commit types
|
|
139
|
+
*/
|
|
140
|
+
getAllCommitTypes(): Array<{
|
|
141
|
+
type: CommitType;
|
|
142
|
+
description: string;
|
|
143
|
+
}>;
|
|
144
|
+
/**
|
|
145
|
+
* Update configuration
|
|
146
|
+
*/
|
|
147
|
+
setConfig(config: Partial<CommitConfig>): void;
|
|
148
|
+
/**
|
|
149
|
+
* Get current configuration
|
|
150
|
+
*/
|
|
151
|
+
getConfig(): CommitConfig;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Create git commit hook
|
|
155
|
+
*/
|
|
156
|
+
export declare function createGitCommitHook(registry: HookRegistry, config?: Partial<CommitConfig>): GitCommitHook;
|
|
157
|
+
export {};
|
|
158
|
+
//# sourceMappingURL=git-commit.d.ts.map
|