@hivehub/rulebook 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +539 -0
- package/dist/agents/claude-code.d.ts +69 -0
- package/dist/agents/claude-code.d.ts.map +1 -0
- package/dist/agents/claude-code.js +180 -0
- package/dist/agents/claude-code.js.map +1 -0
- package/dist/agents/cursor-agent.d.ts +184 -0
- package/dist/agents/cursor-agent.d.ts.map +1 -0
- package/dist/agents/cursor-agent.js +299 -0
- package/dist/agents/cursor-agent.js.map +1 -0
- package/dist/agents/gemini-cli.d.ts +69 -0
- package/dist/agents/gemini-cli.d.ts.map +1 -0
- package/dist/agents/gemini-cli.js +180 -0
- package/dist/agents/gemini-cli.js.map +1 -0
- package/dist/cli/commands.d.ts +57 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +1370 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/docs-prompts.d.ts +3 -0
- package/dist/cli/docs-prompts.d.ts.map +1 -0
- package/dist/cli/docs-prompts.js +45 -0
- package/dist/cli/docs-prompts.js.map +1 -0
- package/dist/cli/prompts.d.ts +6 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +376 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/core/agent-manager.d.ts +89 -0
- package/dist/core/agent-manager.d.ts.map +1 -0
- package/dist/core/agent-manager.js +546 -0
- package/dist/core/agent-manager.js.map +1 -0
- package/dist/core/auto-fixer.d.ts +14 -0
- package/dist/core/auto-fixer.d.ts.map +1 -0
- package/dist/core/auto-fixer.js +207 -0
- package/dist/core/auto-fixer.js.map +1 -0
- package/dist/core/changelog-generator.d.ts +44 -0
- package/dist/core/changelog-generator.d.ts.map +1 -0
- package/dist/core/changelog-generator.js +222 -0
- package/dist/core/changelog-generator.js.map +1 -0
- package/dist/core/cli-bridge.d.ts +113 -0
- package/dist/core/cli-bridge.d.ts.map +1 -0
- package/dist/core/cli-bridge.js +1094 -0
- package/dist/core/cli-bridge.js.map +1 -0
- package/dist/core/config-manager.d.ts +65 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +266 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/coverage-checker.d.ts +14 -0
- package/dist/core/coverage-checker.d.ts.map +1 -0
- package/dist/core/coverage-checker.js +176 -0
- package/dist/core/coverage-checker.js.map +1 -0
- package/dist/core/custom-templates.d.ts +27 -0
- package/dist/core/custom-templates.d.ts.map +1 -0
- package/dist/core/custom-templates.js +122 -0
- package/dist/core/custom-templates.js.map +1 -0
- package/dist/core/dependency-checker.d.ts +21 -0
- package/dist/core/dependency-checker.d.ts.map +1 -0
- package/dist/core/dependency-checker.js +247 -0
- package/dist/core/dependency-checker.js.map +1 -0
- package/dist/core/detector.d.ts +3 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +1443 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/docs-generator.d.ts +9 -0
- package/dist/core/docs-generator.d.ts.map +1 -0
- package/dist/core/docs-generator.js +531 -0
- package/dist/core/docs-generator.js.map +1 -0
- package/dist/core/generator.d.ts +16 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +561 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/gitignore-generator.d.ts +13 -0
- package/dist/core/gitignore-generator.d.ts.map +1 -0
- package/dist/core/gitignore-generator.js +307 -0
- package/dist/core/gitignore-generator.js.map +1 -0
- package/dist/core/health-scorer.d.ts +22 -0
- package/dist/core/health-scorer.d.ts.map +1 -0
- package/dist/core/health-scorer.js +395 -0
- package/dist/core/health-scorer.js.map +1 -0
- package/dist/core/logger.d.ts +116 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +289 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/merger.d.ts +6 -0
- package/dist/core/merger.d.ts.map +1 -0
- package/dist/core/merger.js +131 -0
- package/dist/core/merger.js.map +1 -0
- package/dist/core/migrator.d.ts +19 -0
- package/dist/core/migrator.d.ts.map +1 -0
- package/dist/core/migrator.js +102 -0
- package/dist/core/migrator.js.map +1 -0
- package/dist/core/minimal-scaffolder.d.ts +8 -0
- package/dist/core/minimal-scaffolder.d.ts.map +1 -0
- package/dist/core/minimal-scaffolder.js +51 -0
- package/dist/core/minimal-scaffolder.js.map +1 -0
- package/dist/core/modern-console-new.d.ts +81 -0
- package/dist/core/modern-console-new.d.ts.map +1 -0
- package/dist/core/modern-console-new.js +340 -0
- package/dist/core/modern-console-new.js.map +1 -0
- package/dist/core/modern-console.d.ts +99 -0
- package/dist/core/modern-console.d.ts.map +1 -0
- package/dist/core/modern-console.js +568 -0
- package/dist/core/modern-console.js.map +1 -0
- package/dist/core/openspec-manager.d.ts +133 -0
- package/dist/core/openspec-manager.d.ts.map +1 -0
- package/dist/core/openspec-manager.js +605 -0
- package/dist/core/openspec-manager.js.map +1 -0
- package/dist/core/openspec-migrator.d.ts +27 -0
- package/dist/core/openspec-migrator.d.ts.map +1 -0
- package/dist/core/openspec-migrator.js +255 -0
- package/dist/core/openspec-migrator.js.map +1 -0
- package/dist/core/task-manager.d.ts +65 -0
- package/dist/core/task-manager.d.ts.map +1 -0
- package/dist/core/task-manager.js +318 -0
- package/dist/core/task-manager.js.map +1 -0
- package/dist/core/test-task-manager.d.ts +49 -0
- package/dist/core/test-task-manager.d.ts.map +1 -0
- package/dist/core/test-task-manager.js +121 -0
- package/dist/core/test-task-manager.js.map +1 -0
- package/dist/core/validator.d.ts +21 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +177 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/core/version-bumper.d.ts +19 -0
- package/dist/core/version-bumper.d.ts.map +1 -0
- package/dist/core/version-bumper.js +180 -0
- package/dist/core/version-bumper.js.map +1 -0
- package/dist/core/watcher.d.ts +9 -0
- package/dist/core/watcher.d.ts.map +1 -0
- package/dist/core/watcher.js +22 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/core/workflow-generator.d.ts +10 -0
- package/dist/core/workflow-generator.d.ts.map +1 -0
- package/dist/core/workflow-generator.js +279 -0
- package/dist/core/workflow-generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/handlers/archive-task.d.ts +17 -0
- package/dist/mcp/handlers/archive-task.d.ts.map +1 -0
- package/dist/mcp/handlers/archive-task.js +36 -0
- package/dist/mcp/handlers/archive-task.js.map +1 -0
- package/dist/mcp/handlers/create-task.d.ts +17 -0
- package/dist/mcp/handlers/create-task.d.ts.map +1 -0
- package/dist/mcp/handlers/create-task.js +56 -0
- package/dist/mcp/handlers/create-task.js.map +1 -0
- package/dist/mcp/handlers/list-tasks.d.ts +22 -0
- package/dist/mcp/handlers/list-tasks.d.ts.map +1 -0
- package/dist/mcp/handlers/list-tasks.js +42 -0
- package/dist/mcp/handlers/list-tasks.js.map +1 -0
- package/dist/mcp/handlers/show-task.d.ts +25 -0
- package/dist/mcp/handlers/show-task.d.ts.map +1 -0
- package/dist/mcp/handlers/show-task.js +43 -0
- package/dist/mcp/handlers/show-task.js.map +1 -0
- package/dist/mcp/handlers/update-task.d.ts +17 -0
- package/dist/mcp/handlers/update-task.d.ts.map +1 -0
- package/dist/mcp/handlers/update-task.js +35 -0
- package/dist/mcp/handlers/update-task.js.map +1 -0
- package/dist/mcp/handlers/validate-task.d.ts +15 -0
- package/dist/mcp/handlers/validate-task.d.ts.map +1 -0
- package/dist/mcp/handlers/validate-task.js +27 -0
- package/dist/mcp/handlers/validate-task.js.map +1 -0
- package/dist/mcp/rulebook-config.d.ts +22 -0
- package/dist/mcp/rulebook-config.d.ts.map +1 -0
- package/dist/mcp/rulebook-config.js +65 -0
- package/dist/mcp/rulebook-config.js.map +1 -0
- package/dist/mcp/rulebook-server.d.ts +4 -0
- package/dist/mcp/rulebook-server.d.ts.map +1 -0
- package/dist/mcp/rulebook-server.js +246 -0
- package/dist/mcp/rulebook-server.js.map +1 -0
- package/dist/types.d.ts +190 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/file-system.d.ts +9 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +51 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/git-hooks.d.ts +8 -0
- package/dist/utils/git-hooks.d.ts.map +1 -0
- package/dist/utils/git-hooks.js +440 -0
- package/dist/utils/git-hooks.js.map +1 -0
- package/dist/utils/rulesignore.d.ts +9 -0
- package/dist/utils/rulesignore.d.ts.map +1 -0
- package/dist/utils/rulesignore.js +42 -0
- package/dist/utils/rulesignore.js.map +1 -0
- package/package.json +106 -0
- package/templates/cli/AIDER.md +49 -0
- package/templates/cli/AMAZON_Q.md +25 -0
- package/templates/cli/AUGGIE.md +32 -0
- package/templates/cli/CLAUDE.md +32 -0
- package/templates/cli/CLAUDE_CODE.md +35 -0
- package/templates/cli/CLINE.md +32 -0
- package/templates/cli/CODEBUDDY.md +20 -0
- package/templates/cli/CODEIUM.md +20 -0
- package/templates/cli/CODEX.md +21 -0
- package/templates/cli/CONTINUE.md +34 -0
- package/templates/cli/CURSOR_CLI.md +28 -0
- package/templates/cli/FACTORY.md +18 -0
- package/templates/cli/GEMINI.md +35 -0
- package/templates/cli/KILOCODE.md +18 -0
- package/templates/cli/OPENCODE.md +18 -0
- package/templates/cli/_GENERIC_TEMPLATE.md +29 -0
- package/templates/commands/rulebook-task-apply.md +67 -0
- package/templates/commands/rulebook-task-archive.md +70 -0
- package/templates/commands/rulebook-task-create.md +93 -0
- package/templates/commands/rulebook-task-list.md +42 -0
- package/templates/commands/rulebook-task-show.md +52 -0
- package/templates/commands/rulebook-task-validate.md +53 -0
- package/templates/core/AGENT_AUTOMATION.md +184 -0
- package/templates/core/DAG.md +304 -0
- package/templates/core/DOCUMENTATION_RULES.md +37 -0
- package/templates/core/QUALITY_ENFORCEMENT.md +68 -0
- package/templates/core/RULEBOOK.md +1874 -0
- package/templates/frameworks/ANGULAR.md +36 -0
- package/templates/frameworks/DJANGO.md +83 -0
- package/templates/frameworks/ELECTRON.md +147 -0
- package/templates/frameworks/FLASK.md +38 -0
- package/templates/frameworks/FLUTTER.md +55 -0
- package/templates/frameworks/JQUERY.md +32 -0
- package/templates/frameworks/LARAVEL.md +38 -0
- package/templates/frameworks/NESTJS.md +43 -0
- package/templates/frameworks/NEXTJS.md +127 -0
- package/templates/frameworks/NUXT.md +40 -0
- package/templates/frameworks/RAILS.md +66 -0
- package/templates/frameworks/REACT.md +38 -0
- package/templates/frameworks/REACT_NATIVE.md +47 -0
- package/templates/frameworks/SPRING.md +39 -0
- package/templates/frameworks/SYMFONY.md +36 -0
- package/templates/frameworks/VUE.md +36 -0
- package/templates/frameworks/ZEND.md +35 -0
- package/templates/git/CI_CD_PATTERNS.md +661 -0
- package/templates/git/GITHUB_ACTIONS.md +728 -0
- package/templates/git/GITLAB_CI.md +730 -0
- package/templates/git/GIT_WORKFLOW.md +1157 -0
- package/templates/git/SECRETS_MANAGEMENT.md +585 -0
- package/templates/hooks/COMMIT_MSG.md +530 -0
- package/templates/hooks/POST_CHECKOUT.md +546 -0
- package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -0
- package/templates/hooks/PRE_COMMIT.md +414 -0
- package/templates/hooks/PRE_PUSH.md +601 -0
- package/templates/hooks/csharp-pre-commit.sh +23 -0
- package/templates/hooks/csharp-pre-push.sh +23 -0
- package/templates/hooks/dart-pre-commit.sh +30 -0
- package/templates/hooks/dart-pre-push.sh +25 -0
- package/templates/hooks/elixir-pre-commit.sh +32 -0
- package/templates/hooks/elixir-pre-push.sh +31 -0
- package/templates/hooks/erlang-pre-commit.sh +30 -0
- package/templates/hooks/erlang-pre-push.sh +37 -0
- package/templates/hooks/go-pre-commit.sh +40 -0
- package/templates/hooks/go-pre-push.sh +31 -0
- package/templates/hooks/haskell-pre-commit.sh +41 -0
- package/templates/hooks/haskell-pre-push.sh +37 -0
- package/templates/hooks/java-pre-commit.sh +34 -0
- package/templates/hooks/java-pre-push.sh +24 -0
- package/templates/hooks/kotlin-pre-commit.sh +32 -0
- package/templates/hooks/kotlin-pre-push.sh +16 -0
- package/templates/hooks/php-pre-commit.sh +36 -0
- package/templates/hooks/php-pre-push.sh +26 -0
- package/templates/hooks/python-pre-commit.sh +51 -0
- package/templates/hooks/python-pre-push.sh +25 -0
- package/templates/hooks/ruby-pre-commit.sh +33 -0
- package/templates/hooks/ruby-pre-push.sh +32 -0
- package/templates/hooks/rust-pre-commit.sh +30 -0
- package/templates/hooks/rust-pre-push.sh +30 -0
- package/templates/hooks/scala-pre-commit.sh +32 -0
- package/templates/hooks/scala-pre-push.sh +24 -0
- package/templates/hooks/swift-pre-commit.sh +25 -0
- package/templates/hooks/swift-pre-push.sh +23 -0
- package/templates/hooks/typescript-pre-commit.sh +37 -0
- package/templates/hooks/typescript-pre-push.sh +36 -0
- package/templates/ides/COPILOT.md +37 -0
- package/templates/ides/CURSOR.md +43 -0
- package/templates/ides/JETBRAINS_AI.md +35 -0
- package/templates/ides/REPLIT.md +36 -0
- package/templates/ides/TABNINE.md +29 -0
- package/templates/ides/VSCODE.md +40 -0
- package/templates/ides/WINDSURF.md +36 -0
- package/templates/ides/ZED.md +32 -0
- package/templates/languages/ADA.md +58 -0
- package/templates/languages/C.md +333 -0
- package/templates/languages/CPP.md +743 -0
- package/templates/languages/CSHARP.md +417 -0
- package/templates/languages/DART.md +332 -0
- package/templates/languages/ELIXIR.md +454 -0
- package/templates/languages/ERLANG.md +361 -0
- package/templates/languages/GO.md +645 -0
- package/templates/languages/HASKELL.md +177 -0
- package/templates/languages/JAVA.md +607 -0
- package/templates/languages/JAVASCRIPT.md +631 -0
- package/templates/languages/JULIA.md +97 -0
- package/templates/languages/KOTLIN.md +511 -0
- package/templates/languages/LISP.md +100 -0
- package/templates/languages/LUA.md +74 -0
- package/templates/languages/OBJECTIVEC.md +90 -0
- package/templates/languages/PHP.md +416 -0
- package/templates/languages/PYTHON.md +682 -0
- package/templates/languages/R.md +350 -0
- package/templates/languages/RUBY.md +421 -0
- package/templates/languages/RUST.md +477 -0
- package/templates/languages/SAS.md +73 -0
- package/templates/languages/SCALA.md +348 -0
- package/templates/languages/SOLIDITY.md +580 -0
- package/templates/languages/SQL.md +137 -0
- package/templates/languages/SWIFT.md +466 -0
- package/templates/languages/TYPESCRIPT.md +591 -0
- package/templates/languages/ZIG.md +265 -0
- package/templates/modules/ATLASSIAN.md +255 -0
- package/templates/modules/CONTEXT7.md +54 -0
- package/templates/modules/FIGMA.md +267 -0
- package/templates/modules/GITHUB_MCP.md +64 -0
- package/templates/modules/GRAFANA.md +328 -0
- package/templates/modules/NOTION.md +247 -0
- package/templates/modules/PLAYWRIGHT.md +90 -0
- package/templates/modules/RULEBOOK_MCP.md +156 -0
- package/templates/modules/SERENA.md +337 -0
- package/templates/modules/SUPABASE.md +223 -0
- package/templates/modules/SYNAP.md +69 -0
- package/templates/modules/VECTORIZER.md +63 -0
- package/templates/services/AZURE_BLOB.md +184 -0
- package/templates/services/CASSANDRA.md +239 -0
- package/templates/services/DYNAMODB.md +308 -0
- package/templates/services/ELASTICSEARCH.md +347 -0
- package/templates/services/GCS.md +178 -0
- package/templates/services/INFLUXDB.md +265 -0
- package/templates/services/KAFKA.md +341 -0
- package/templates/services/MARIADB.md +183 -0
- package/templates/services/MEMCACHED.md +242 -0
- package/templates/services/MINIO.md +201 -0
- package/templates/services/MONGODB.md +268 -0
- package/templates/services/MYSQL.md +358 -0
- package/templates/services/NEO4J.md +247 -0
- package/templates/services/ORACLE.md +290 -0
- package/templates/services/POSTGRESQL.md +326 -0
- package/templates/services/RABBITMQ.md +286 -0
- package/templates/services/REDIS.md +292 -0
- package/templates/services/S3.md +298 -0
- package/templates/services/SQLITE.md +294 -0
- package/templates/services/SQLSERVER.md +294 -0
- package/templates/workflows/codespell.yml +31 -0
- package/templates/workflows/cpp-lint.yml +47 -0
- package/templates/workflows/cpp-publish.yml +119 -0
- package/templates/workflows/cpp-test.yml +77 -0
- package/templates/workflows/dotnet-lint.yml +29 -0
- package/templates/workflows/dotnet-publish.yml +40 -0
- package/templates/workflows/dotnet-test.yml +41 -0
- package/templates/workflows/elixir-lint.yml +45 -0
- package/templates/workflows/elixir-publish.yml +49 -0
- package/templates/workflows/elixir-test.yml +54 -0
- package/templates/workflows/erlang-lint.yml +47 -0
- package/templates/workflows/erlang-test.yml +62 -0
- package/templates/workflows/go-lint.yml +39 -0
- package/templates/workflows/go-publish.yml +95 -0
- package/templates/workflows/go-test.yml +59 -0
- package/templates/workflows/java-lint.yml +60 -0
- package/templates/workflows/java-publish.yml +120 -0
- package/templates/workflows/java-test.yml +85 -0
- package/templates/workflows/kotlin-lint.yml +34 -0
- package/templates/workflows/kotlin-publish.yml +56 -0
- package/templates/workflows/kotlin-test.yml +48 -0
- package/templates/workflows/php-lint.yml +39 -0
- package/templates/workflows/php-publish.yml +50 -0
- package/templates/workflows/php-test.yml +54 -0
- package/templates/workflows/python-lint.yml +47 -0
- package/templates/workflows/python-publish.yml +91 -0
- package/templates/workflows/python-test.yml +59 -0
- package/templates/workflows/rust-lint.yml +54 -0
- package/templates/workflows/rust-publish.yml +66 -0
- package/templates/workflows/rust-test.yml +75 -0
- package/templates/workflows/solidity-lint.yml +41 -0
- package/templates/workflows/solidity-test.yml +47 -0
- package/templates/workflows/swift-lint.yml +32 -0
- package/templates/workflows/swift-publish.yml +58 -0
- package/templates/workflows/swift-test.yml +44 -0
- package/templates/workflows/typescript-lint.yml +61 -0
- package/templates/workflows/typescript-publish.yml +60 -0
- package/templates/workflows/typescript-test.yml +73 -0
- package/templates/workflows/zig-lint.yml +27 -0
- package/templates/workflows/zig-test.yml +40 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { writeFile, existsSync, mkdirSync, readdir, unlink } from 'fs';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
const writeFileAsync = promisify(writeFile);
|
|
5
|
+
const readdirAsync = promisify(readdir);
|
|
6
|
+
const unlinkAsync = promisify(unlink);
|
|
7
|
+
const LOGS_DIR = 'openspec/logs';
|
|
8
|
+
const MAX_LOG_AGE_DAYS = 30;
|
|
9
|
+
export class Logger {
|
|
10
|
+
logsPath;
|
|
11
|
+
currentLogFile;
|
|
12
|
+
logBuffer = [];
|
|
13
|
+
bufferSize = 10;
|
|
14
|
+
flushInterval = null;
|
|
15
|
+
constructor(projectRoot) {
|
|
16
|
+
this.logsPath = join(projectRoot, LOGS_DIR);
|
|
17
|
+
this.currentLogFile = join(this.logsPath, this.generateLogFileName());
|
|
18
|
+
this.initializeLogging();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Initialize logging directory and start flush interval
|
|
22
|
+
*/
|
|
23
|
+
async initializeLogging() {
|
|
24
|
+
if (!existsSync(this.logsPath)) {
|
|
25
|
+
mkdirSync(this.logsPath, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
// Start periodic flush
|
|
28
|
+
this.flushInterval = setInterval(() => {
|
|
29
|
+
this.flush();
|
|
30
|
+
}, 5000); // Flush every 5 seconds
|
|
31
|
+
// Clean old logs on startup
|
|
32
|
+
await this.cleanOldLogs();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generate log file name with timestamp
|
|
36
|
+
*/
|
|
37
|
+
generateLogFileName() {
|
|
38
|
+
const now = new Date();
|
|
39
|
+
const timestamp = now.toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
40
|
+
return `agent-${timestamp}.log`;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Log a message
|
|
44
|
+
*/
|
|
45
|
+
log(level, message, context, taskId, duration) {
|
|
46
|
+
const entry = {
|
|
47
|
+
timestamp: new Date().toISOString(),
|
|
48
|
+
level,
|
|
49
|
+
message,
|
|
50
|
+
context,
|
|
51
|
+
taskId,
|
|
52
|
+
duration,
|
|
53
|
+
};
|
|
54
|
+
this.logBuffer.push(entry);
|
|
55
|
+
// Flush if buffer is full
|
|
56
|
+
if (this.logBuffer.length >= this.bufferSize) {
|
|
57
|
+
this.flush();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Log debug message
|
|
62
|
+
*/
|
|
63
|
+
debug(message, context, taskId) {
|
|
64
|
+
this.log('debug', message, context, taskId);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Log info message
|
|
68
|
+
*/
|
|
69
|
+
info(message, context, taskId) {
|
|
70
|
+
this.log('info', message, context, taskId);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Log warning message
|
|
74
|
+
*/
|
|
75
|
+
warn(message, context, taskId) {
|
|
76
|
+
this.log('warn', message, context, taskId);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Log error message
|
|
80
|
+
*/
|
|
81
|
+
error(message, context, taskId) {
|
|
82
|
+
this.log('error', message, context, taskId);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Log task start
|
|
86
|
+
*/
|
|
87
|
+
taskStart(taskId, taskTitle) {
|
|
88
|
+
this.info(`Task started: ${taskTitle}`, { taskId, action: 'start' }, taskId);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Log task completion
|
|
92
|
+
*/
|
|
93
|
+
taskComplete(taskId, taskTitle, duration) {
|
|
94
|
+
this.info(`Task completed: ${taskTitle}`, { taskId, action: 'complete', duration }, taskId);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Log task failure
|
|
98
|
+
*/
|
|
99
|
+
taskFailed(taskId, taskTitle, error, duration) {
|
|
100
|
+
this.error(`Task failed: ${taskTitle}`, { taskId, action: 'failed', error, duration }, taskId);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Log CLI command execution
|
|
104
|
+
*/
|
|
105
|
+
cliCommand(command, tool, taskId) {
|
|
106
|
+
this.debug(`CLI command: ${command}`, { tool, command }, taskId);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Log CLI response
|
|
110
|
+
*/
|
|
111
|
+
cliResponse(tool, response, duration, taskId) {
|
|
112
|
+
this.debug(`CLI response from ${tool}`, { tool, responseLength: response.length, duration }, taskId);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Log test execution
|
|
116
|
+
*/
|
|
117
|
+
testExecution(testType, result, duration, taskId) {
|
|
118
|
+
this.info(`Test ${testType}: ${result}`, { testType, result, duration }, taskId);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Log coverage check
|
|
122
|
+
*/
|
|
123
|
+
coverageCheck(percentage, threshold, taskId) {
|
|
124
|
+
const status = percentage >= threshold ? 'passed' : 'failed';
|
|
125
|
+
this.info(`Coverage check: ${status}`, { percentage, threshold, status }, taskId);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Flush log buffer to file
|
|
129
|
+
*/
|
|
130
|
+
async flush() {
|
|
131
|
+
if (this.logBuffer.length === 0) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const entries = [...this.logBuffer];
|
|
136
|
+
this.logBuffer = [];
|
|
137
|
+
const logContent = entries.map((entry) => JSON.stringify(entry)).join('\n') + '\n';
|
|
138
|
+
await writeFileAsync(this.currentLogFile, logContent, { flag: 'a' });
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.error('Failed to flush logs:', error);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Force flush and close logger
|
|
146
|
+
*/
|
|
147
|
+
async close() {
|
|
148
|
+
if (this.flushInterval) {
|
|
149
|
+
clearInterval(this.flushInterval);
|
|
150
|
+
this.flushInterval = null;
|
|
151
|
+
}
|
|
152
|
+
await this.flush();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Clean old log files
|
|
156
|
+
*/
|
|
157
|
+
async cleanOldLogs() {
|
|
158
|
+
try {
|
|
159
|
+
const files = await readdirAsync(this.logsPath);
|
|
160
|
+
const cutoffDate = new Date();
|
|
161
|
+
cutoffDate.setDate(cutoffDate.getDate() - MAX_LOG_AGE_DAYS);
|
|
162
|
+
for (const file of files) {
|
|
163
|
+
if (file.startsWith('agent-') && file.endsWith('.log')) {
|
|
164
|
+
const filePath = join(this.logsPath, file);
|
|
165
|
+
const stats = await import('fs').then((fs) => fs.promises.stat(filePath));
|
|
166
|
+
if (stats.mtime < cutoffDate) {
|
|
167
|
+
await unlinkAsync(filePath);
|
|
168
|
+
this.info(`Cleaned old log file: ${file}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
this.error('Failed to clean old logs', { error: String(error) });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get recent log entries
|
|
179
|
+
*/
|
|
180
|
+
async getRecentLogs(limit = 100) {
|
|
181
|
+
try {
|
|
182
|
+
const files = await readdirAsync(this.logsPath);
|
|
183
|
+
const logFiles = files
|
|
184
|
+
.filter((file) => file.startsWith('agent-') && file.endsWith('.log'))
|
|
185
|
+
.sort()
|
|
186
|
+
.reverse(); // Most recent first
|
|
187
|
+
const entries = [];
|
|
188
|
+
for (const file of logFiles) {
|
|
189
|
+
if (entries.length >= limit)
|
|
190
|
+
break;
|
|
191
|
+
const filePath = join(this.logsPath, file);
|
|
192
|
+
const content = await import('fs').then((fs) => fs.promises.readFile(filePath, 'utf-8'));
|
|
193
|
+
const lines = content
|
|
194
|
+
.trim()
|
|
195
|
+
.split('\n')
|
|
196
|
+
.filter((line) => line.trim());
|
|
197
|
+
for (const line of lines) {
|
|
198
|
+
if (entries.length >= limit)
|
|
199
|
+
break;
|
|
200
|
+
try {
|
|
201
|
+
const entry = JSON.parse(line);
|
|
202
|
+
entries.push(entry);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Skip malformed entries
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return entries.slice(0, limit);
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
this.error('Failed to get recent logs', { error: String(error) });
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get logs for specific task
|
|
218
|
+
*/
|
|
219
|
+
async getTaskLogs(taskId) {
|
|
220
|
+
const recentLogs = await this.getRecentLogs(1000);
|
|
221
|
+
return recentLogs.filter((entry) => entry.taskId === taskId);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get logs by level
|
|
225
|
+
*/
|
|
226
|
+
async getLogsByLevel(level, limit = 100) {
|
|
227
|
+
const recentLogs = await this.getRecentLogs(limit * 2);
|
|
228
|
+
return recentLogs.filter((entry) => entry.level === level).slice(0, limit);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get error logs
|
|
232
|
+
*/
|
|
233
|
+
async getErrorLogs(limit = 50) {
|
|
234
|
+
return this.getLogsByLevel('error', limit);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Generate log summary
|
|
238
|
+
*/
|
|
239
|
+
async getLogSummary() {
|
|
240
|
+
const recentLogs = await this.getRecentLogs(1000);
|
|
241
|
+
const summary = {
|
|
242
|
+
totalEntries: recentLogs.length,
|
|
243
|
+
byLevel: {},
|
|
244
|
+
recentErrors: 0,
|
|
245
|
+
oldestEntry: undefined,
|
|
246
|
+
newestEntry: undefined,
|
|
247
|
+
};
|
|
248
|
+
for (const entry of recentLogs) {
|
|
249
|
+
summary.byLevel[entry.level] = (summary.byLevel[entry.level] || 0) + 1;
|
|
250
|
+
if (entry.level === 'error') {
|
|
251
|
+
summary.recentErrors++;
|
|
252
|
+
}
|
|
253
|
+
if (!summary.oldestEntry || entry.timestamp < summary.oldestEntry) {
|
|
254
|
+
summary.oldestEntry = entry.timestamp;
|
|
255
|
+
}
|
|
256
|
+
if (!summary.newestEntry || entry.timestamp > summary.newestEntry) {
|
|
257
|
+
summary.newestEntry = entry.timestamp;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return summary;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Create a new Logger instance
|
|
265
|
+
*/
|
|
266
|
+
export function createLogger(projectRoot) {
|
|
267
|
+
return new Logger(projectRoot);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Global logger instance
|
|
271
|
+
*/
|
|
272
|
+
let globalLogger = null;
|
|
273
|
+
/**
|
|
274
|
+
* Initialize global logger
|
|
275
|
+
*/
|
|
276
|
+
export function initializeLogger(projectRoot) {
|
|
277
|
+
globalLogger = new Logger(projectRoot);
|
|
278
|
+
return globalLogger;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get global logger instance
|
|
282
|
+
*/
|
|
283
|
+
export function getLogger() {
|
|
284
|
+
if (!globalLogger) {
|
|
285
|
+
throw new Error('Logger not initialized. Call initializeLogger() first.');
|
|
286
|
+
}
|
|
287
|
+
return globalLogger;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ExistingAgentsInfo, ProjectConfig } from '../types.js';
|
|
2
|
+
export declare function mergeAgents(existing: ExistingAgentsInfo, config: ProjectConfig): Promise<string>;
|
|
3
|
+
export declare function mergeLanguageRules(existing: ExistingAgentsInfo, language: string): Promise<string>;
|
|
4
|
+
export declare function mergeModuleRules(existing: ExistingAgentsInfo, module: string): Promise<string>;
|
|
5
|
+
export declare function mergeFullAgents(existing: ExistingAgentsInfo, config: ProjectConfig, projectRoot?: string): Promise<string>;
|
|
6
|
+
//# sourceMappingURL=merger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAc,MAAM,aAAa,CAAC;AAQjF,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,aAAa,EACrB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CA0DjB"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { generateAgentsContent, generateLanguageRules, generateModuleRules } from './generator.js';
|
|
2
|
+
import { hasEmbeddedTemplates, migrateEmbeddedTemplates, replaceEmbeddedWithReferences, } from './migrator.js';
|
|
3
|
+
export async function mergeAgents(existing, config) {
|
|
4
|
+
const lines = existing.content.split('\n');
|
|
5
|
+
const rulebookBlock = existing.blocks.find((b) => b.name === 'RULEBOOK');
|
|
6
|
+
// Generate new RULEBOOK content
|
|
7
|
+
const newRulebookContent = await generateAgentsContent(config);
|
|
8
|
+
if (rulebookBlock) {
|
|
9
|
+
// Replace existing RULEBOOK block
|
|
10
|
+
const beforeBlock = lines.slice(0, rulebookBlock.startLine).join('\n');
|
|
11
|
+
const afterBlock = lines.slice(rulebookBlock.endLine + 1).join('\n');
|
|
12
|
+
return [beforeBlock, newRulebookContent, afterBlock].join('\n').trim() + '\n';
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
// Insert RULEBOOK at the beginning
|
|
16
|
+
return [newRulebookContent, '', existing.content].join('\n').trim() + '\n';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function mergeLanguageRules(existing, language) {
|
|
20
|
+
const lines = existing.content.split('\n');
|
|
21
|
+
const blockName = language.toUpperCase();
|
|
22
|
+
const languageBlock = existing.blocks.find((b) => b.name === blockName);
|
|
23
|
+
const newLanguageContent = await generateLanguageRules(language);
|
|
24
|
+
if (languageBlock) {
|
|
25
|
+
// Replace existing language block
|
|
26
|
+
const beforeBlock = lines.slice(0, languageBlock.startLine).join('\n');
|
|
27
|
+
const afterBlock = lines.slice(languageBlock.endLine + 1).join('\n');
|
|
28
|
+
return [beforeBlock, newLanguageContent, afterBlock].join('\n').trim() + '\n';
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Append language block at the end
|
|
32
|
+
return [existing.content, '', newLanguageContent].join('\n').trim() + '\n';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function mergeModuleRules(existing, module) {
|
|
36
|
+
const lines = existing.content.split('\n');
|
|
37
|
+
const blockName = module.toUpperCase();
|
|
38
|
+
const moduleBlock = existing.blocks.find((b) => b.name === blockName);
|
|
39
|
+
const newModuleContent = await generateModuleRules(module);
|
|
40
|
+
if (moduleBlock) {
|
|
41
|
+
// Replace existing module block
|
|
42
|
+
const beforeBlock = lines.slice(0, moduleBlock.startLine).join('\n');
|
|
43
|
+
const afterBlock = lines.slice(moduleBlock.endLine + 1).join('\n');
|
|
44
|
+
return [beforeBlock, newModuleContent, afterBlock].join('\n').trim() + '\n';
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Append module block at the end
|
|
48
|
+
return [existing.content, '', newModuleContent].join('\n').trim() + '\n';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export async function mergeFullAgents(existing, config, projectRoot) {
|
|
52
|
+
// Check if we need to migrate from embedded to modular
|
|
53
|
+
const needsMigration = hasEmbeddedTemplates(existing) && config.modular !== false;
|
|
54
|
+
if (needsMigration && projectRoot) {
|
|
55
|
+
// Migrate embedded templates to /rulebook/ directory
|
|
56
|
+
await migrateEmbeddedTemplates(existing, config, projectRoot);
|
|
57
|
+
// Generate new modular AGENTS.md with references
|
|
58
|
+
// This replaces the entire content with modular format
|
|
59
|
+
return await replaceEmbeddedWithReferences(config, projectRoot);
|
|
60
|
+
}
|
|
61
|
+
// Legacy merge behavior (for non-modular mode or when migration not needed)
|
|
62
|
+
let content = existing.content;
|
|
63
|
+
let currentExisting = { ...existing };
|
|
64
|
+
// Merge RULEBOOK section
|
|
65
|
+
content = await mergeAgents(currentExisting, config);
|
|
66
|
+
// Update existing info for next merge
|
|
67
|
+
currentExisting = {
|
|
68
|
+
...currentExisting,
|
|
69
|
+
content,
|
|
70
|
+
blocks: parseBlocks(content),
|
|
71
|
+
};
|
|
72
|
+
// If modular mode, use generateModularAgents instead of merging blocks
|
|
73
|
+
if (config.modular !== false && projectRoot) {
|
|
74
|
+
const { generateModularAgents } = await import('./generator.js');
|
|
75
|
+
return await generateModularAgents(config, projectRoot);
|
|
76
|
+
}
|
|
77
|
+
// Legacy: Merge language rules (embedded)
|
|
78
|
+
for (const language of config.languages) {
|
|
79
|
+
content = await mergeLanguageRules(currentExisting, language);
|
|
80
|
+
// Update existing info for next merge
|
|
81
|
+
currentExisting = {
|
|
82
|
+
...currentExisting,
|
|
83
|
+
content,
|
|
84
|
+
blocks: parseBlocks(content),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// Legacy: Merge module rules (embedded)
|
|
88
|
+
for (const module of config.modules) {
|
|
89
|
+
content = await mergeModuleRules(currentExisting, module);
|
|
90
|
+
// Update existing info for next merge
|
|
91
|
+
currentExisting = {
|
|
92
|
+
...currentExisting,
|
|
93
|
+
content,
|
|
94
|
+
blocks: parseBlocks(content),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return content;
|
|
98
|
+
}
|
|
99
|
+
// Helper function to parse blocks
|
|
100
|
+
function parseBlocks(content) {
|
|
101
|
+
const blocks = [];
|
|
102
|
+
const lines = content.split('\n');
|
|
103
|
+
let currentBlock = null;
|
|
104
|
+
for (let i = 0; i < lines.length; i++) {
|
|
105
|
+
const line = lines[i];
|
|
106
|
+
const startMatch = line.match(/<!--\s*([A-Z_]+):START\s*-->/);
|
|
107
|
+
const endMatch = line.match(/<!--\s*([A-Z_]+):END\s*-->/);
|
|
108
|
+
if (startMatch) {
|
|
109
|
+
currentBlock = {
|
|
110
|
+
name: startMatch[1],
|
|
111
|
+
startLine: i,
|
|
112
|
+
content: [line],
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
else if (endMatch && currentBlock) {
|
|
116
|
+
currentBlock.content.push(line);
|
|
117
|
+
blocks.push({
|
|
118
|
+
name: currentBlock.name,
|
|
119
|
+
startLine: currentBlock.startLine,
|
|
120
|
+
endLine: i,
|
|
121
|
+
content: currentBlock.content.join('\n'),
|
|
122
|
+
});
|
|
123
|
+
currentBlock = null;
|
|
124
|
+
}
|
|
125
|
+
else if (currentBlock) {
|
|
126
|
+
currentBlock.content.push(line);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return blocks;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=merger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACnG,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAA4B,EAC5B,MAAqB;IAErB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAEzE,gCAAgC;IAChC,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE/D,IAAI,aAAa,EAAE,CAAC;QAClB,kCAAkC;QAClC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,CAAC,WAAW,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,mCAAmC;QACnC,OAAO,CAAC,kBAAkB,EAAE,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAA4B,EAC5B,QAAgB;IAEhB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAExE,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAEjE,IAAI,aAAa,EAAE,CAAC;QAClB,kCAAkC;QAClC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,CAAC,WAAW,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,mCAAmC;QACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAA4B,EAC5B,MAAc;IAEd,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAEtE,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE3D,IAAI,WAAW,EAAE,CAAC;QAChB,gCAAgC;QAChC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,OAAO,CAAC,WAAW,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,iCAAiC;QACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAA4B,EAC5B,MAAqB,EACrB,WAAoB;IAEpB,uDAAuD;IACvD,MAAM,cAAc,GAAG,oBAAoB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC;IAElF,IAAI,cAAc,IAAI,WAAW,EAAE,CAAC;QAClC,qDAAqD;QACrD,MAAM,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAE9D,iDAAiD;QACjD,uDAAuD;QACvD,OAAO,MAAM,6BAA6B,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClE,CAAC;IAED,4EAA4E;IAC5E,IAAI,OAAO,GAAG,QAAQ,CAAC,OAAQ,CAAC;IAChC,IAAI,eAAe,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAEtC,yBAAyB;IACzB,OAAO,GAAG,MAAM,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAErD,sCAAsC;IACtC,eAAe,GAAG;QAChB,GAAG,eAAe;QAClB,OAAO;QACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;KAC7B,CAAC;IAEF,uEAAuE;IACvE,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,WAAW,EAAE,CAAC;QAC5C,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACjE,OAAO,MAAM,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC1D,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,OAAO,GAAG,MAAM,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAE9D,sCAAsC;QACtC,eAAe,GAAG;YAChB,GAAG,eAAe;YAClB,OAAO;YACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAE1D,sCAAsC;QACtC,eAAe,GAAG;YAChB,GAAG,eAAe;YAClB,OAAO;YACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;SAC7B,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kCAAkC;AAClC,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,YAAY,GAAkE,IAAI,CAAC;IAEvF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAE1D,IAAI,UAAU,EAAE,CAAC;YACf,YAAY,GAAG;gBACb,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;gBACnB,SAAS,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAC,IAAI,CAAC;aAChB,CAAC;QACJ,CAAC;aAAM,IAAI,QAAQ,IAAI,YAAY,EAAE,CAAC;YACpC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,SAAS,EAAE,YAAY,CAAC,SAAS;gBACjC,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;aACzC,CAAC,CAAC;YACH,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ExistingAgentsInfo, ProjectConfig } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detect if AGENTS.md contains embedded templates (legacy mode)
|
|
4
|
+
*/
|
|
5
|
+
export declare function hasEmbeddedTemplates(existing: ExistingAgentsInfo): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Extract embedded template content and write to /rulebook/ directory
|
|
8
|
+
*/
|
|
9
|
+
export declare function migrateEmbeddedTemplates(existing: ExistingAgentsInfo, config: ProjectConfig, projectRoot: string): Promise<{
|
|
10
|
+
extractedLanguages: string[];
|
|
11
|
+
extractedModules: string[];
|
|
12
|
+
extractedFrameworks: string[];
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* Replace embedded templates with references in AGENTS.md
|
|
16
|
+
* Uses generateModularAgents to ensure consistent format
|
|
17
|
+
*/
|
|
18
|
+
export declare function replaceEmbeddedWithReferences(config: ProjectConfig, projectRoot: string): Promise<string>;
|
|
19
|
+
//# sourceMappingURL=migrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/core/migrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQrE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAoB1E;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B,CAAC,CA4ED;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAIjB"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { writeFile, ensureDir } from '../utils/file-system.js';
|
|
3
|
+
import { generateLanguageRules, generateModuleRules, generateFrameworkRules, generateModularAgents, } from './generator.js';
|
|
4
|
+
/**
|
|
5
|
+
* Detect if AGENTS.md contains embedded templates (legacy mode)
|
|
6
|
+
*/
|
|
7
|
+
export function hasEmbeddedTemplates(existing) {
|
|
8
|
+
if (!existing.content)
|
|
9
|
+
return false;
|
|
10
|
+
// Check for embedded language blocks (e.g., <!-- TYPESCRIPT:START -->)
|
|
11
|
+
const embeddedLanguagePattern = /<!--\s*(TYPESCRIPT|RUST|PYTHON|JAVASCRIPT|GO|JAVA|ELIXIR|CSHARP|PHP|SWIFT|KOTLIN|CPP|C|SOLIDITY|ZIG|ERLANG|DART|RUBY|SCALA|R|HASKELL|JULIA|LUA|ADA|SAS|LISP|OBJECTIVEC|SQL):START\s*-->/i;
|
|
12
|
+
// Check for embedded module blocks (e.g., <!-- OPENSPEC:START -->)
|
|
13
|
+
const embeddedModulePattern = /<!--\s*(VECTORIZER|SYNAP|CONTEXT7|GITHUB|PLAYWRIGHT|SUPABASE|NOTION|ATLASSIAN|SERENA|FIGMA|GRAFANA|AGENT_AUTOMATION):START\s*-->/i;
|
|
14
|
+
// Check for embedded framework blocks (e.g., <!-- REACT:START -->)
|
|
15
|
+
const embeddedFrameworkPattern = /<!--\s*(NESTJS|SPRING|LARAVEL|ANGULAR|REACT|VUE|NUXT|NEXTJS|DJANGO|RAILS|FLASK|SYMFONY|ZEND|JQUERY|REACTNATIVE|FLUTTER|ELECTRON):START\s*-->/i;
|
|
16
|
+
return (embeddedLanguagePattern.test(existing.content) ||
|
|
17
|
+
embeddedModulePattern.test(existing.content) ||
|
|
18
|
+
embeddedFrameworkPattern.test(existing.content));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract embedded template content and write to /rulebook/ directory
|
|
22
|
+
*/
|
|
23
|
+
export async function migrateEmbeddedTemplates(existing, config, projectRoot) {
|
|
24
|
+
const rulebookDir = config.rulebookDir || 'rulebook';
|
|
25
|
+
const rulebookPath = path.join(projectRoot, rulebookDir);
|
|
26
|
+
await ensureDir(rulebookPath);
|
|
27
|
+
// Note: If files already exist, they will be overwritten
|
|
28
|
+
// This is intentional for migration - existing modular files take precedence
|
|
29
|
+
const extractedLanguages = [];
|
|
30
|
+
const extractedModules = [];
|
|
31
|
+
const extractedFrameworks = [];
|
|
32
|
+
if (!existing.content) {
|
|
33
|
+
return { extractedLanguages, extractedModules, extractedFrameworks };
|
|
34
|
+
}
|
|
35
|
+
// Extract language blocks
|
|
36
|
+
for (const language of config.languages) {
|
|
37
|
+
const blockName = language.toUpperCase();
|
|
38
|
+
const languageBlock = existing.blocks.find((b) => b.name === blockName);
|
|
39
|
+
if (languageBlock && languageBlock.content) {
|
|
40
|
+
// Write extracted content to /rulebook/[LANG].md
|
|
41
|
+
const filePath = path.join(rulebookPath, `${blockName}.md`);
|
|
42
|
+
await writeFile(filePath, languageBlock.content);
|
|
43
|
+
extractedLanguages.push(language);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Generate new template if not found
|
|
47
|
+
const langRules = await generateLanguageRules(language);
|
|
48
|
+
const filePath = path.join(rulebookPath, `${blockName}.md`);
|
|
49
|
+
await writeFile(filePath, langRules);
|
|
50
|
+
extractedLanguages.push(language);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Extract module blocks
|
|
54
|
+
for (const module of config.modules) {
|
|
55
|
+
const blockName = module.toUpperCase();
|
|
56
|
+
const moduleBlock = existing.blocks.find((b) => b.name === blockName);
|
|
57
|
+
if (moduleBlock && moduleBlock.content) {
|
|
58
|
+
// Write extracted content to /rulebook/[MODULE].md
|
|
59
|
+
const filePath = path.join(rulebookPath, `${blockName}.md`);
|
|
60
|
+
await writeFile(filePath, moduleBlock.content);
|
|
61
|
+
extractedModules.push(module);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Generate new template if not found
|
|
65
|
+
const moduleRules = await generateModuleRules(module);
|
|
66
|
+
const filePath = path.join(rulebookPath, `${blockName}.md`);
|
|
67
|
+
await writeFile(filePath, moduleRules);
|
|
68
|
+
extractedModules.push(module);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Extract framework blocks
|
|
72
|
+
if (config.frameworks) {
|
|
73
|
+
for (const framework of config.frameworks) {
|
|
74
|
+
const blockName = framework.toUpperCase();
|
|
75
|
+
const frameworkBlock = existing.blocks.find((b) => b.name === blockName);
|
|
76
|
+
if (frameworkBlock && frameworkBlock.content) {
|
|
77
|
+
// Write extracted content to /rulebook/[FRAMEWORK].md
|
|
78
|
+
const filePath = path.join(rulebookPath, `${blockName}.md`);
|
|
79
|
+
await writeFile(filePath, frameworkBlock.content);
|
|
80
|
+
extractedFrameworks.push(framework);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Generate new template if not found
|
|
84
|
+
const frameworkRules = await generateFrameworkRules(framework);
|
|
85
|
+
const filePath = path.join(rulebookPath, `${blockName}.md`);
|
|
86
|
+
await writeFile(filePath, frameworkRules);
|
|
87
|
+
extractedFrameworks.push(framework);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return { extractedLanguages, extractedModules, extractedFrameworks };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Replace embedded templates with references in AGENTS.md
|
|
95
|
+
* Uses generateModularAgents to ensure consistent format
|
|
96
|
+
*/
|
|
97
|
+
export async function replaceEmbeddedWithReferences(config, projectRoot) {
|
|
98
|
+
// Use generateModularAgents to get the proper format with references
|
|
99
|
+
// This ensures consistency and handles all the reference generation
|
|
100
|
+
return await generateModularAgents(config, projectRoot);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=migrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrator.js","sourceRoot":"","sources":["../../src/core/migrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface MinimalScaffoldOptions {
|
|
2
|
+
projectName?: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
license?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function scaffoldMinimalProject(projectDir: string, options?: MinimalScaffoldOptions): Promise<string[]>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=minimal-scaffolder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimal-scaffolder.d.ts","sourceRoot":"","sources":["../../src/core/minimal-scaffolder.ts"],"names":[],"mappings":"AAIA,UAAU,sBAAsB;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,MAAM,EAAE,CAAC,CAwDnB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { ensureDir, fileExists, writeFile } from '../utils/file-system.js';
|
|
3
|
+
import { generateDocsStructure } from './docs-generator.js';
|
|
4
|
+
export async function scaffoldMinimalProject(projectDir, options = {}) {
|
|
5
|
+
const generated = [];
|
|
6
|
+
const projectName = options.projectName || path.basename(projectDir);
|
|
7
|
+
const description = options.description || `${projectName} project bootstrapped with Rulebook minimal mode.`;
|
|
8
|
+
const licenseName = options.license || 'MIT';
|
|
9
|
+
// Generate concise docs structure and root README (minimal mode)
|
|
10
|
+
const docsFiles = await generateDocsStructure({
|
|
11
|
+
projectName,
|
|
12
|
+
description,
|
|
13
|
+
author: 'Project Team',
|
|
14
|
+
license: licenseName,
|
|
15
|
+
}, projectDir, 'minimal');
|
|
16
|
+
generated.push(...docsFiles);
|
|
17
|
+
// Ensure LICENSE exists (Apache-2.0 by default)
|
|
18
|
+
const licensePath = path.join(projectDir, 'LICENSE');
|
|
19
|
+
if (!(await fileExists(licensePath))) {
|
|
20
|
+
const licenseContent = `Apache License
|
|
21
|
+
Version 2.0, January 2004
|
|
22
|
+
http://www.apache.org/licenses/
|
|
23
|
+
|
|
24
|
+
Copyright ${new Date().getFullYear()} ${projectName}
|
|
25
|
+
|
|
26
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
27
|
+
you may not use this file except in compliance with the License.
|
|
28
|
+
You may obtain a copy of the License at
|
|
29
|
+
|
|
30
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
31
|
+
|
|
32
|
+
Unless required by applicable law or agreed to in writing, software
|
|
33
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
34
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
35
|
+
See the License for the specific language governing permissions and
|
|
36
|
+
limitations under the License.
|
|
37
|
+
`;
|
|
38
|
+
await writeFile(licensePath, licenseContent);
|
|
39
|
+
generated.push(licensePath);
|
|
40
|
+
}
|
|
41
|
+
// Ensure tests directory exists with placeholder
|
|
42
|
+
const testsDir = path.join(projectDir, 'tests');
|
|
43
|
+
await ensureDir(testsDir);
|
|
44
|
+
const placeholderTest = path.join(testsDir, '.gitkeep');
|
|
45
|
+
if (!(await fileExists(placeholderTest))) {
|
|
46
|
+
await writeFile(placeholderTest, '');
|
|
47
|
+
generated.push(placeholderTest);
|
|
48
|
+
}
|
|
49
|
+
return Array.from(new Set(generated));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=minimal-scaffolder.js.map
|