@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,605 @@
|
|
|
1
|
+
import { readFile, writeFile, existsSync, mkdirSync, readdirSync } from 'fs';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { randomUUID } from 'crypto';
|
|
5
|
+
const readFileAsync = promisify(readFile);
|
|
6
|
+
const writeFileAsync = promisify(writeFile);
|
|
7
|
+
const OPENSPEC_DIR = 'openspec';
|
|
8
|
+
const CHANGES_DIR = 'changes';
|
|
9
|
+
const SPECS_DIR = 'specs';
|
|
10
|
+
const TASKS_FILE = 'tasks.md';
|
|
11
|
+
export class OpenSpecManager {
|
|
12
|
+
openspecPath;
|
|
13
|
+
changesPath;
|
|
14
|
+
specsPath;
|
|
15
|
+
data = null;
|
|
16
|
+
onLog;
|
|
17
|
+
constructor(projectRoot) {
|
|
18
|
+
this.openspecPath = join(projectRoot, OPENSPEC_DIR);
|
|
19
|
+
this.changesPath = join(this.openspecPath, CHANGES_DIR);
|
|
20
|
+
this.specsPath = join(this.openspecPath, SPECS_DIR);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Set callback for logging (used by watcher UI)
|
|
24
|
+
*/
|
|
25
|
+
setLogCallback(callback) {
|
|
26
|
+
this.onLog = callback;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Initialize OpenSpec directory structure
|
|
30
|
+
*/
|
|
31
|
+
async initialize() {
|
|
32
|
+
if (!existsSync(this.openspecPath)) {
|
|
33
|
+
mkdirSync(this.openspecPath, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
if (!existsSync(this.changesPath)) {
|
|
36
|
+
mkdirSync(this.changesPath, { recursive: true });
|
|
37
|
+
}
|
|
38
|
+
if (!existsSync(this.specsPath)) {
|
|
39
|
+
mkdirSync(this.specsPath, { recursive: true });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Load OpenSpec data from changes directory
|
|
44
|
+
*/
|
|
45
|
+
async loadOpenSpec() {
|
|
46
|
+
if (this.data) {
|
|
47
|
+
return this.data;
|
|
48
|
+
}
|
|
49
|
+
await this.initialize();
|
|
50
|
+
try {
|
|
51
|
+
// Load tasks from all changes
|
|
52
|
+
const tasks = await this.loadTasksFromChanges();
|
|
53
|
+
// Load current task from metadata
|
|
54
|
+
let currentTask;
|
|
55
|
+
// Load history from completed tasks
|
|
56
|
+
const history = tasks.filter((t) => t.status === 'completed');
|
|
57
|
+
this.data = {
|
|
58
|
+
tasks: tasks.filter((t) => t.status !== 'completed'),
|
|
59
|
+
currentTask,
|
|
60
|
+
history,
|
|
61
|
+
metadata: {
|
|
62
|
+
version: '1.0.0',
|
|
63
|
+
createdAt: new Date().toISOString(),
|
|
64
|
+
updatedAt: new Date().toISOString(),
|
|
65
|
+
totalTasks: tasks.length,
|
|
66
|
+
completedTasks: history.length,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
return this.data;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
throw new Error(`Failed to load OpenSpec data: ${error}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Save OpenSpec data (tasks are managed in changes, so this is mostly for metadata)
|
|
77
|
+
*/
|
|
78
|
+
async saveOpenSpec() {
|
|
79
|
+
if (!this.data) {
|
|
80
|
+
throw new Error('No data to save');
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
await this.initialize();
|
|
84
|
+
// Update metadata
|
|
85
|
+
this.data.metadata.updatedAt = new Date().toISOString();
|
|
86
|
+
this.data.metadata.totalTasks = this.data.tasks.length + this.data.history.length;
|
|
87
|
+
this.data.metadata.completedTasks = this.data.history.length;
|
|
88
|
+
// Tasks are managed in individual change files, not in a central file
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
throw new Error(`Failed to save OpenSpec data: ${error}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Sync task status on agent start
|
|
96
|
+
* Loads all tasks and ensures the data is fresh
|
|
97
|
+
*/
|
|
98
|
+
async syncTaskStatus() {
|
|
99
|
+
// Clear cached data to force reload
|
|
100
|
+
this.data = null;
|
|
101
|
+
// Reload all tasks
|
|
102
|
+
const data = await this.loadOpenSpec();
|
|
103
|
+
// Log task summary
|
|
104
|
+
const totalTasks = data.tasks.length + data.history.length;
|
|
105
|
+
const pendingTasks = data.tasks.filter((t) => t.status === 'pending').length;
|
|
106
|
+
const inProgressTasks = data.tasks.filter((t) => t.status === 'in-progress').length;
|
|
107
|
+
const completedTasks = data.history.length;
|
|
108
|
+
const msg = ` Tasks: ${totalTasks} total | ${pendingTasks} pending | ${inProgressTasks} in progress | ${completedTasks} completed`;
|
|
109
|
+
// Use callback if available (watcher mode), otherwise console.log (CLI mode)
|
|
110
|
+
if (this.onLog) {
|
|
111
|
+
this.onLog('info', msg);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
console.log(msg);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Load tasks from all changes directories
|
|
119
|
+
*/
|
|
120
|
+
async loadTasksFromChanges() {
|
|
121
|
+
const allTasks = [];
|
|
122
|
+
if (!existsSync(this.changesPath)) {
|
|
123
|
+
return allTasks;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const changeDirs = readdirSync(this.changesPath, { withFileTypes: true })
|
|
127
|
+
.filter((dirent) => dirent.isDirectory())
|
|
128
|
+
.map((dirent) => dirent.name);
|
|
129
|
+
for (const changeDir of changeDirs) {
|
|
130
|
+
const tasksPath = join(this.changesPath, changeDir, TASKS_FILE);
|
|
131
|
+
if (existsSync(tasksPath)) {
|
|
132
|
+
const tasksContent = await readFileAsync(tasksPath, 'utf-8');
|
|
133
|
+
const tasks = this.parseTasksFromMarkdown(tasksContent);
|
|
134
|
+
allTasks.push(...tasks);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
const msg = `Warning: Could not load tasks from changes: ${error}`;
|
|
140
|
+
if (this.onLog) {
|
|
141
|
+
this.onLog('warning', msg);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
console.warn(msg);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return allTasks;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Parse tasks from markdown content
|
|
151
|
+
*/
|
|
152
|
+
parseTasksFromMarkdown(content) {
|
|
153
|
+
const tasks = [];
|
|
154
|
+
const lines = content.split('\n');
|
|
155
|
+
for (let i = 0; i < lines.length; i++) {
|
|
156
|
+
const line = lines[i].trim();
|
|
157
|
+
// Check for task list items
|
|
158
|
+
if (line.startsWith('- [') && line.includes(']')) {
|
|
159
|
+
const statusMatch = line.match(/^- \[([x ])\] (.+)$/);
|
|
160
|
+
if (statusMatch) {
|
|
161
|
+
const isCompleted = statusMatch[1] === 'x';
|
|
162
|
+
const taskTitle = statusMatch[2];
|
|
163
|
+
// Extract task ID from title - handle both formats:
|
|
164
|
+
// 1. **TASK-ID**: Description (current format)
|
|
165
|
+
// 2. Description (id: TASK-ID) (legacy format)
|
|
166
|
+
let id;
|
|
167
|
+
let title;
|
|
168
|
+
const boldIdMatch = taskTitle.match(/^\*\*(.+?)\*\*: (.+)$/);
|
|
169
|
+
if (boldIdMatch) {
|
|
170
|
+
id = boldIdMatch[1];
|
|
171
|
+
title = boldIdMatch[2];
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
const idMatch = taskTitle.match(/^(.+) \(id: (.+)\)$/);
|
|
175
|
+
if (idMatch) {
|
|
176
|
+
title = idMatch[1];
|
|
177
|
+
id = idMatch[2];
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
id = randomUUID();
|
|
181
|
+
title = taskTitle;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Extract priority from task ID if it follows pattern like INIT-001, REFACTOR-002, etc.
|
|
185
|
+
let priority = 1;
|
|
186
|
+
const priorityMatch = id.match(/^([A-Z]+)-(\d+)$/);
|
|
187
|
+
if (priorityMatch) {
|
|
188
|
+
const phase = priorityMatch[1];
|
|
189
|
+
const phaseNumber = parseInt(priorityMatch[2]);
|
|
190
|
+
// Map phase names to priority numbers
|
|
191
|
+
const phasePriority = {
|
|
192
|
+
INIT: 0,
|
|
193
|
+
TEST: 1,
|
|
194
|
+
REFACTOR: 2,
|
|
195
|
+
IMPLEMENT: 3,
|
|
196
|
+
INTEGRATE: 4,
|
|
197
|
+
STYLE: 5,
|
|
198
|
+
OPTIMIZE: 6,
|
|
199
|
+
DOCS: 7,
|
|
200
|
+
QA: 8,
|
|
201
|
+
};
|
|
202
|
+
priority = (phasePriority[phase] || 9) * 1000 + phaseNumber;
|
|
203
|
+
}
|
|
204
|
+
// Extract dependencies from subsequent lines
|
|
205
|
+
const dependencies = [];
|
|
206
|
+
let j = i + 1;
|
|
207
|
+
while (j < lines.length && lines[j].startsWith(' -')) {
|
|
208
|
+
const depMatch = lines[j].match(/^- (.+) \(id: (.+)\)$/);
|
|
209
|
+
if (depMatch) {
|
|
210
|
+
dependencies.push(depMatch[2]);
|
|
211
|
+
}
|
|
212
|
+
j++;
|
|
213
|
+
}
|
|
214
|
+
const task = {
|
|
215
|
+
id,
|
|
216
|
+
title,
|
|
217
|
+
description: title,
|
|
218
|
+
priority,
|
|
219
|
+
status: isCompleted ? 'completed' : 'pending',
|
|
220
|
+
dependencies,
|
|
221
|
+
estimatedTime: 1800, // Default 30 minutes
|
|
222
|
+
createdAt: new Date().toISOString(),
|
|
223
|
+
updatedAt: new Date().toISOString(),
|
|
224
|
+
attempts: 0,
|
|
225
|
+
tags: [],
|
|
226
|
+
};
|
|
227
|
+
tasks.push(task);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return tasks;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Get tasks ordered by priority
|
|
235
|
+
*/
|
|
236
|
+
async getTasksByPriority() {
|
|
237
|
+
const data = await this.loadOpenSpec();
|
|
238
|
+
return data.tasks
|
|
239
|
+
.filter((task) => task.status === 'pending')
|
|
240
|
+
.sort((a, b) => a.priority - b.priority);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Get current active task
|
|
244
|
+
*/
|
|
245
|
+
async getCurrentTask() {
|
|
246
|
+
const data = await this.loadOpenSpec();
|
|
247
|
+
if (!data.currentTask) {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
return data.tasks.find((task) => task.id === data.currentTask) || null;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Set current task
|
|
254
|
+
*/
|
|
255
|
+
async setCurrentTask(taskId) {
|
|
256
|
+
const data = await this.loadOpenSpec();
|
|
257
|
+
const task = data.tasks.find((t) => t.id === taskId);
|
|
258
|
+
if (!task) {
|
|
259
|
+
throw new Error(`Task ${taskId} not found`);
|
|
260
|
+
}
|
|
261
|
+
data.currentTask = taskId;
|
|
262
|
+
this.data = data;
|
|
263
|
+
await this.saveOpenSpec();
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Update task status
|
|
267
|
+
*/
|
|
268
|
+
async updateTaskStatus(taskId, status) {
|
|
269
|
+
const data = await this.loadOpenSpec();
|
|
270
|
+
const taskIndex = data.tasks.findIndex((t) => t.id === taskId);
|
|
271
|
+
if (taskIndex === -1) {
|
|
272
|
+
throw new Error(`Task ${taskId} not found`);
|
|
273
|
+
}
|
|
274
|
+
const task = data.tasks[taskIndex];
|
|
275
|
+
task.status = status;
|
|
276
|
+
task.updatedAt = new Date().toISOString();
|
|
277
|
+
if (status === 'completed') {
|
|
278
|
+
task.completedAt = new Date().toISOString();
|
|
279
|
+
// Move to history
|
|
280
|
+
data.history.push(task);
|
|
281
|
+
data.tasks.splice(taskIndex, 1);
|
|
282
|
+
// Clear current task if it was completed
|
|
283
|
+
if (data.currentTask === taskId) {
|
|
284
|
+
data.currentTask = undefined;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
else if (status === 'in-progress') {
|
|
288
|
+
data.currentTask = taskId;
|
|
289
|
+
}
|
|
290
|
+
this.data = data;
|
|
291
|
+
await this.saveOpenSpec();
|
|
292
|
+
// Update markdown files for all status changes (only for relevant statuses)
|
|
293
|
+
if (status === 'completed' || status === 'in-progress' || status === 'failed') {
|
|
294
|
+
await this.updateMarkdownTaskStatus(taskId, status);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Mark task as complete
|
|
299
|
+
*/
|
|
300
|
+
async markTaskComplete(taskId) {
|
|
301
|
+
await this.updateTaskStatus(taskId, 'completed');
|
|
302
|
+
// Automatically update OpenSpec markdown files
|
|
303
|
+
await this.updateMarkdownTaskStatus(taskId, 'completed');
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Update task status in markdown files
|
|
307
|
+
*/
|
|
308
|
+
async updateMarkdownTaskStatus(taskId, status) {
|
|
309
|
+
try {
|
|
310
|
+
// Find all tasks.md files in the changes directory
|
|
311
|
+
const changesDirs = readdirSync(this.changesPath, { withFileTypes: true })
|
|
312
|
+
.filter((dirent) => dirent.isDirectory())
|
|
313
|
+
.map((dirent) => dirent.name);
|
|
314
|
+
for (const dir of changesDirs) {
|
|
315
|
+
const tasksFilePath = join(this.changesPath, dir, TASKS_FILE);
|
|
316
|
+
if (existsSync(tasksFilePath)) {
|
|
317
|
+
const content = await readFileAsync(tasksFilePath, 'utf8');
|
|
318
|
+
// Update task status in markdown
|
|
319
|
+
const updatedContent = this.updateTaskInMarkdown(content, taskId, status);
|
|
320
|
+
if (updatedContent !== content) {
|
|
321
|
+
await writeFileAsync(tasksFilePath, updatedContent, 'utf8');
|
|
322
|
+
if (this.onLog) {
|
|
323
|
+
this.onLog('success', `Updated task status in ${join(dir, TASKS_FILE)}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
if (this.onLog) {
|
|
331
|
+
this.onLog('warning', `Failed to update markdown files: ${error}`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Update task status in markdown content
|
|
337
|
+
*/
|
|
338
|
+
updateTaskInMarkdown(content, taskId, status) {
|
|
339
|
+
// Create regex pattern to match task lines with the specific task ID
|
|
340
|
+
const taskPattern = new RegExp(`(- \\[ \\] \\*\\*${taskId}\\*\\*.*?)(?=\\n|$)`, 'g');
|
|
341
|
+
let updatedContent = content;
|
|
342
|
+
let hasChanges = false;
|
|
343
|
+
// Replace pending tasks with completed/in-progress/failed
|
|
344
|
+
updatedContent = updatedContent.replace(taskPattern, (match) => {
|
|
345
|
+
hasChanges = true;
|
|
346
|
+
if (status === 'completed') {
|
|
347
|
+
return match.replace('- [ ]', '- [x]');
|
|
348
|
+
}
|
|
349
|
+
else if (status === 'in-progress') {
|
|
350
|
+
return match.replace('- [ ]', '- [~]'); // Using ~ for in-progress
|
|
351
|
+
}
|
|
352
|
+
else if (status === 'failed') {
|
|
353
|
+
return match.replace('- [ ]', '- [!]'); // Using ! for failed
|
|
354
|
+
}
|
|
355
|
+
return match;
|
|
356
|
+
});
|
|
357
|
+
return hasChanges ? updatedContent : content;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Add new task
|
|
361
|
+
*/
|
|
362
|
+
async addTask(task) {
|
|
363
|
+
const data = await this.loadOpenSpec();
|
|
364
|
+
const newTask = {
|
|
365
|
+
...task,
|
|
366
|
+
id: randomUUID(),
|
|
367
|
+
createdAt: new Date().toISOString(),
|
|
368
|
+
updatedAt: new Date().toISOString(),
|
|
369
|
+
attempts: 0,
|
|
370
|
+
};
|
|
371
|
+
data.tasks.push(newTask);
|
|
372
|
+
this.data = data;
|
|
373
|
+
await this.saveOpenSpec();
|
|
374
|
+
return newTask.id;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Get task by ID
|
|
378
|
+
*/
|
|
379
|
+
async getTask(taskId) {
|
|
380
|
+
const data = await this.loadOpenSpec();
|
|
381
|
+
return data.tasks.find((t) => t.id === taskId) || null;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Get task dependencies
|
|
385
|
+
*/
|
|
386
|
+
async getTaskDependencies(taskId) {
|
|
387
|
+
const data = await this.loadOpenSpec();
|
|
388
|
+
const task = data.tasks.find((t) => t.id === taskId);
|
|
389
|
+
if (!task) {
|
|
390
|
+
return [];
|
|
391
|
+
}
|
|
392
|
+
return data.tasks.filter((t) => task.dependencies.includes(t.id));
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Check if task dependencies are satisfied
|
|
396
|
+
*/
|
|
397
|
+
async areDependenciesSatisfied(taskId) {
|
|
398
|
+
const dependencies = await this.getTaskDependencies(taskId);
|
|
399
|
+
return dependencies.every((dep) => dep.status === 'completed');
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get next available task
|
|
403
|
+
*/
|
|
404
|
+
async getNextTask() {
|
|
405
|
+
const pendingTasks = await this.getTasksByPriority();
|
|
406
|
+
for (const task of pendingTasks) {
|
|
407
|
+
if (await this.areDependenciesSatisfied(task.id)) {
|
|
408
|
+
return task;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Increment task attempts
|
|
415
|
+
*/
|
|
416
|
+
async incrementTaskAttempts(taskId) {
|
|
417
|
+
const data = await this.loadOpenSpec();
|
|
418
|
+
const task = data.tasks.find((t) => t.id === taskId);
|
|
419
|
+
if (task) {
|
|
420
|
+
task.attempts++;
|
|
421
|
+
task.updatedAt = new Date().toISOString();
|
|
422
|
+
this.data = data;
|
|
423
|
+
await this.saveOpenSpec();
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Get task statistics
|
|
428
|
+
*/
|
|
429
|
+
async getTaskStats() {
|
|
430
|
+
const data = await this.loadOpenSpec();
|
|
431
|
+
const stats = {
|
|
432
|
+
total: data.tasks.length + data.history.length,
|
|
433
|
+
pending: 0,
|
|
434
|
+
inProgress: 0,
|
|
435
|
+
completed: data.history.length,
|
|
436
|
+
failed: 0,
|
|
437
|
+
skipped: 0,
|
|
438
|
+
};
|
|
439
|
+
for (const task of data.tasks) {
|
|
440
|
+
if (task.status === 'in-progress') {
|
|
441
|
+
stats.inProgress++;
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
stats[task.status]++;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
return stats;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Generate ASCII dependency tree
|
|
451
|
+
*/
|
|
452
|
+
async generateDependencyTree() {
|
|
453
|
+
const data = await this.loadOpenSpec();
|
|
454
|
+
const lines = [];
|
|
455
|
+
lines.push('Task Dependency Tree:');
|
|
456
|
+
lines.push('');
|
|
457
|
+
const visited = new Set();
|
|
458
|
+
const processing = new Set();
|
|
459
|
+
const buildTree = (taskId, depth = 0) => {
|
|
460
|
+
if (processing.has(taskId)) {
|
|
461
|
+
lines.push(`${' '.repeat(depth)}└─ ${taskId} (circular dependency)`);
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
if (visited.has(taskId)) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
processing.add(taskId);
|
|
468
|
+
visited.add(taskId);
|
|
469
|
+
const task = [...data.tasks, ...data.history].find((t) => t.id === taskId);
|
|
470
|
+
if (!task) {
|
|
471
|
+
processing.delete(taskId);
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
const prefix = depth === 0 ? '├─' : '└─';
|
|
475
|
+
const status = task.status === 'completed'
|
|
476
|
+
? '✓'
|
|
477
|
+
: task.status === 'in-progress'
|
|
478
|
+
? '⚙'
|
|
479
|
+
: task.status === 'failed'
|
|
480
|
+
? '✗'
|
|
481
|
+
: '○';
|
|
482
|
+
lines.push(`${' '.repeat(depth)}${prefix} ${status} ${task.title} (${task.status})`);
|
|
483
|
+
for (const depId of task.dependencies) {
|
|
484
|
+
buildTree(depId, depth + 1);
|
|
485
|
+
}
|
|
486
|
+
processing.delete(taskId);
|
|
487
|
+
};
|
|
488
|
+
// Start with tasks that have no dependencies
|
|
489
|
+
const allTasks = [...data.tasks, ...data.history];
|
|
490
|
+
const rootTasks = allTasks.filter((task) => task.dependencies.length === 0);
|
|
491
|
+
for (const task of rootTasks) {
|
|
492
|
+
buildTree(task.id);
|
|
493
|
+
}
|
|
494
|
+
return lines.join('\n');
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Validate dependency graph for cycles
|
|
498
|
+
*/
|
|
499
|
+
async validateDependencyGraph() {
|
|
500
|
+
const data = await this.loadOpenSpec();
|
|
501
|
+
const visited = new Set();
|
|
502
|
+
const processing = new Set();
|
|
503
|
+
const cycles = [];
|
|
504
|
+
const dfs = (taskId, path) => {
|
|
505
|
+
if (processing.has(taskId)) {
|
|
506
|
+
// Found a cycle
|
|
507
|
+
const cycleStart = path.indexOf(taskId);
|
|
508
|
+
cycles.push(path.slice(cycleStart));
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
if (visited.has(taskId)) {
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
visited.add(taskId);
|
|
515
|
+
processing.add(taskId);
|
|
516
|
+
const allTasks = [...data.tasks, ...data.history];
|
|
517
|
+
const task = allTasks.find((t) => t.id === taskId);
|
|
518
|
+
if (task) {
|
|
519
|
+
for (const depId of task.dependencies) {
|
|
520
|
+
dfs(depId, [...path, taskId]);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
processing.delete(taskId);
|
|
524
|
+
};
|
|
525
|
+
// Check all tasks
|
|
526
|
+
const allTasks = [...data.tasks, ...data.history];
|
|
527
|
+
for (const task of allTasks) {
|
|
528
|
+
if (!visited.has(task.id)) {
|
|
529
|
+
dfs(task.id, []);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
return {
|
|
533
|
+
valid: cycles.length === 0,
|
|
534
|
+
cycles,
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Get tasks that can be executed in parallel
|
|
539
|
+
*/
|
|
540
|
+
async getParallelExecutableTasks() {
|
|
541
|
+
const data = await this.loadOpenSpec();
|
|
542
|
+
const levels = [];
|
|
543
|
+
const processed = new Set();
|
|
544
|
+
const getLevel = (tasks, level = 0) => {
|
|
545
|
+
if (tasks.length === 0)
|
|
546
|
+
return;
|
|
547
|
+
if (!levels[level]) {
|
|
548
|
+
levels[level] = [];
|
|
549
|
+
}
|
|
550
|
+
const currentLevelTasks = [];
|
|
551
|
+
for (const task of tasks) {
|
|
552
|
+
if (processed.has(task.id))
|
|
553
|
+
continue;
|
|
554
|
+
const dependencies = data.tasks.filter((t) => task.dependencies.includes(t.id));
|
|
555
|
+
const allDependenciesProcessed = dependencies.every((dep) => processed.has(dep.id));
|
|
556
|
+
if (allDependenciesProcessed) {
|
|
557
|
+
currentLevelTasks.push(task);
|
|
558
|
+
processed.add(task.id);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
if (currentLevelTasks.length > 0) {
|
|
562
|
+
levels[level] = currentLevelTasks;
|
|
563
|
+
getLevel(data.tasks.filter((t) => !processed.has(t.id)), level + 1);
|
|
564
|
+
}
|
|
565
|
+
};
|
|
566
|
+
getLevel(data.tasks.filter((t) => t.status === 'pending'));
|
|
567
|
+
return levels.filter((level) => level.length > 0);
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Get execution order respecting dependencies
|
|
571
|
+
*/
|
|
572
|
+
async getExecutionOrder() {
|
|
573
|
+
const parallelLevels = await this.getParallelExecutableTasks();
|
|
574
|
+
const executionOrder = [];
|
|
575
|
+
for (const level of parallelLevels) {
|
|
576
|
+
executionOrder.push(...level);
|
|
577
|
+
}
|
|
578
|
+
return executionOrder;
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Check if task can be started (dependencies satisfied)
|
|
582
|
+
*/
|
|
583
|
+
async canStartTask(taskId) {
|
|
584
|
+
const dependencies = await this.getTaskDependencies(taskId);
|
|
585
|
+
return dependencies.every((dep) => dep.status === 'completed');
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Get blocking tasks (tasks that block the given task)
|
|
589
|
+
*/
|
|
590
|
+
async getBlockingTasks(taskId) {
|
|
591
|
+
const data = await this.loadOpenSpec();
|
|
592
|
+
const task = data.tasks.find((t) => t.id === taskId);
|
|
593
|
+
if (!task) {
|
|
594
|
+
return [];
|
|
595
|
+
}
|
|
596
|
+
return data.tasks.filter((t) => task.dependencies.includes(t.id) && t.status !== 'completed');
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Create a new OpenSpecManager instance
|
|
601
|
+
*/
|
|
602
|
+
export function createOpenSpecManager(projectRoot) {
|
|
603
|
+
return new OpenSpecManager(projectRoot);
|
|
604
|
+
}
|
|
605
|
+
//# sourceMappingURL=openspec-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openspec-manager.js","sourceRoot":"","sources":["../../src/core/openspec-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface MigrationResult {
|
|
2
|
+
migrated: number;
|
|
3
|
+
skipped: number;
|
|
4
|
+
errors: string[];
|
|
5
|
+
migratedTasks: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Migrate OpenSpec tasks to Rulebook format
|
|
9
|
+
*/
|
|
10
|
+
export declare function migrateOpenSpecToRulebook(projectRoot: string, rulebookDir?: string): Promise<MigrationResult>;
|
|
11
|
+
/**
|
|
12
|
+
* Migrate OpenSpec archived tasks to Rulebook format
|
|
13
|
+
*/
|
|
14
|
+
export declare function migrateOpenSpecArchives(projectRoot: string, rulebookDir?: string): Promise<MigrationResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Remove /rulebook/OPENSPEC.md if it exists
|
|
17
|
+
*/
|
|
18
|
+
export declare function removeOpenSpecRulebookFile(projectRoot: string, rulebookDir?: string): Promise<boolean>;
|
|
19
|
+
/**
|
|
20
|
+
* Remove OpenSpec commands from .cursor/commands/
|
|
21
|
+
*/
|
|
22
|
+
export declare function removeOpenSpecCommands(projectRoot: string): Promise<number>;
|
|
23
|
+
/**
|
|
24
|
+
* Archive OpenSpec directory (move to archive)
|
|
25
|
+
*/
|
|
26
|
+
export declare function archiveOpenSpecDirectory(projectRoot: string): Promise<boolean>;
|
|
27
|
+
//# sourceMappingURL=openspec-migrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openspec-migrator.d.ts","sourceRoot":"","sources":["../../src/core/openspec-migrator.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAAmB,GAC/B,OAAO,CAAC,eAAe,CAAC,CAoG1B;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAAmB,GAC/B,OAAO,CAAC,eAAe,CAAC,CAqG1B;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAAmB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBjF;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBpF"}
|