@hivehub/rulebook 5.5.1 → 5.7.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/.claude/commands/rulebook-learn-capture.md +41 -48
- package/.claude/commands/rulebook-learn-list.md +13 -13
- package/README.md +332 -394
- package/dist/cli/commands/context-intelligence.d.ts +0 -1
- package/dist/cli/commands/context-intelligence.d.ts.map +1 -1
- package/dist/cli/commands/context-intelligence.js +12 -33
- package/dist/cli/commands/context-intelligence.js.map +1 -1
- package/dist/cli/commands/index.d.ts +4 -7
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +4 -7
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +40 -81
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +0 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +1 -7
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/memory.d.ts +7 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +51 -57
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/misc.d.ts +1 -15
- package/dist/cli/commands/misc.d.ts.map +1 -1
- package/dist/cli/commands/misc.js +36 -215
- package/dist/cli/commands/misc.js.map +1 -1
- package/dist/cli/commands/plans.d.ts +0 -6
- package/dist/cli/commands/plans.d.ts.map +1 -1
- package/dist/cli/commands/plans.js +9 -77
- package/dist/cli/commands/plans.js.map +1 -1
- package/dist/cli/commands/skills.js +6 -6
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/task.js +4 -4
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +122 -52
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/prompts.d.ts.map +1 -1
- package/dist/cli/prompts.js +1 -78
- package/dist/cli/prompts.js.map +1 -1
- package/dist/core/claude/claude-mcp.d.ts +59 -0
- package/dist/core/claude/claude-mcp.d.ts.map +1 -0
- package/dist/core/claude/claude-mcp.js +220 -0
- package/dist/core/claude/claude-mcp.js.map +1 -0
- package/dist/core/claude/claude-md-generator.d.ts +52 -0
- package/dist/core/claude/claude-md-generator.d.ts.map +1 -0
- package/dist/core/claude/claude-md-generator.js +104 -0
- package/dist/core/claude/claude-md-generator.js.map +1 -0
- package/dist/core/claude/claude-settings-manager.d.ts +44 -0
- package/dist/core/claude/claude-settings-manager.d.ts.map +1 -0
- package/dist/core/claude/claude-settings-manager.js +194 -0
- package/dist/core/claude/claude-settings-manager.js.map +1 -0
- package/dist/core/claude-settings-manager.d.ts.map +1 -1
- package/dist/core/claude-settings-manager.js +9 -3
- package/dist/core/claude-settings-manager.js.map +1 -1
- package/dist/core/console/cli-bridge.d.ts +113 -0
- package/dist/core/console/cli-bridge.d.ts.map +1 -0
- package/dist/core/console/cli-bridge.js +1094 -0
- package/dist/core/console/cli-bridge.js.map +1 -0
- package/dist/core/detect/detector.d.ts +35 -0
- package/dist/core/detect/detector.d.ts.map +1 -0
- package/dist/core/detect/detector.js +541 -0
- package/dist/core/detect/detector.js.map +1 -0
- package/dist/core/docs/docs-generator.d.ts +9 -0
- package/dist/core/docs/docs-generator.d.ts.map +1 -0
- package/dist/core/docs/docs-generator.js +531 -0
- package/dist/core/docs/docs-generator.js.map +1 -0
- package/dist/core/docs/mcp-reference-generator.d.ts +13 -0
- package/dist/core/docs/mcp-reference-generator.d.ts.map +1 -0
- package/dist/core/docs/mcp-reference-generator.js +66 -0
- package/dist/core/docs/mcp-reference-generator.js.map +1 -0
- package/dist/core/generators/generator.d.ts +54 -0
- package/dist/core/generators/generator.d.ts.map +1 -0
- package/dist/core/generators/generator.js +1041 -0
- package/dist/core/generators/generator.js.map +1 -0
- package/dist/core/generators/gitignore-generator.d.ts +13 -0
- package/dist/core/generators/gitignore-generator.d.ts.map +1 -0
- package/dist/core/generators/gitignore-generator.js +307 -0
- package/dist/core/generators/gitignore-generator.js.map +1 -0
- package/dist/core/generators/minimal-scaffolder.d.ts +8 -0
- package/dist/core/generators/minimal-scaffolder.d.ts.map +1 -0
- package/dist/core/generators/minimal-scaffolder.js +51 -0
- package/dist/core/generators/minimal-scaffolder.js.map +1 -0
- package/dist/core/generators/rules-generator.d.ts +73 -0
- package/dist/core/generators/rules-generator.d.ts.map +1 -0
- package/dist/core/generators/rules-generator.js +202 -0
- package/dist/core/generators/rules-generator.js.map +1 -0
- package/dist/core/generators/workflow-generator.d.ts +15 -0
- package/dist/core/generators/workflow-generator.d.ts.map +1 -0
- package/dist/core/generators/workflow-generator.js +390 -0
- package/dist/core/generators/workflow-generator.js.map +1 -0
- package/dist/core/ide/multi-tool-generator.d.ts +59 -0
- package/dist/core/ide/multi-tool-generator.d.ts.map +1 -0
- package/dist/core/ide/multi-tool-generator.js +157 -0
- package/dist/core/ide/multi-tool-generator.js.map +1 -0
- package/dist/core/ide/opencode-generator.d.ts +72 -0
- package/dist/core/ide/opencode-generator.d.ts.map +1 -0
- package/dist/core/ide/opencode-generator.js +450 -0
- package/dist/core/ide/opencode-generator.js.map +1 -0
- package/dist/core/merger.d.ts +1 -1
- package/dist/core/merger.d.ts.map +1 -1
- package/dist/core/merger.js +5 -5
- package/dist/core/merger.js.map +1 -1
- package/dist/core/migrator.d.ts +0 -1
- package/dist/core/migrator.d.ts.map +1 -1
- package/dist/core/migrator.js +4 -29
- package/dist/core/migrator.js.map +1 -1
- package/dist/core/quality/coverage-checker.d.ts +14 -0
- package/dist/core/quality/coverage-checker.d.ts.map +1 -0
- package/dist/core/quality/coverage-checker.js +176 -0
- package/dist/core/quality/coverage-checker.js.map +1 -0
- package/dist/core/quality/dependency-checker.d.ts +21 -0
- package/dist/core/quality/dependency-checker.d.ts.map +1 -0
- package/dist/core/quality/dependency-checker.js +247 -0
- package/dist/core/quality/dependency-checker.js.map +1 -0
- package/dist/core/quality/doctor.d.ts +19 -0
- package/dist/core/quality/doctor.d.ts.map +1 -0
- package/dist/core/quality/doctor.js +163 -0
- package/dist/core/quality/doctor.js.map +1 -0
- package/dist/core/quality/validator.d.ts +21 -0
- package/dist/core/quality/validator.d.ts.map +1 -0
- package/dist/core/quality/validator.js +177 -0
- package/dist/core/quality/validator.js.map +1 -0
- package/dist/core/ralph-scripts.d.ts.map +1 -1
- package/dist/core/ralph-scripts.js +7 -6
- package/dist/core/ralph-scripts.js.map +1 -1
- package/dist/core/skills/skills-manager.d.ts +126 -0
- package/dist/core/skills/skills-manager.d.ts.map +1 -0
- package/dist/core/skills/skills-manager.js +630 -0
- package/dist/core/skills/skills-manager.js.map +1 -0
- package/dist/core/state/config-manager.d.ts +86 -0
- package/dist/core/state/config-manager.d.ts.map +1 -0
- package/dist/core/state/config-manager.js +562 -0
- package/dist/core/state/config-manager.js.map +1 -0
- package/dist/core/state/override-manager.d.ts +23 -0
- package/dist/core/state/override-manager.d.ts.map +1 -0
- package/dist/core/state/override-manager.js +82 -0
- package/dist/core/state/override-manager.js.map +1 -0
- package/dist/core/state/state-writer.d.ts +34 -0
- package/dist/core/state/state-writer.d.ts.map +1 -0
- package/dist/core/state/state-writer.js +78 -0
- package/dist/core/state/state-writer.js.map +1 -0
- package/dist/core/state/version-bumper.d.ts +19 -0
- package/dist/core/state/version-bumper.d.ts.map +1 -0
- package/dist/core/state/version-bumper.js +180 -0
- package/dist/core/state/version-bumper.js.map +1 -0
- package/dist/core/tasks/decision-manager.d.ts +25 -0
- package/dist/core/tasks/decision-manager.d.ts.map +1 -0
- package/dist/core/tasks/decision-manager.js +183 -0
- package/dist/core/tasks/decision-manager.js.map +1 -0
- package/dist/core/tasks/knowledge-manager.d.ts +24 -0
- package/dist/core/tasks/knowledge-manager.d.ts.map +1 -0
- package/dist/core/tasks/knowledge-manager.js +173 -0
- package/dist/core/tasks/knowledge-manager.js.map +1 -0
- package/dist/core/tasks/learn-manager.d.ts +27 -0
- package/dist/core/tasks/learn-manager.d.ts.map +1 -0
- package/dist/core/tasks/learn-manager.js +121 -0
- package/dist/core/tasks/learn-manager.js.map +1 -0
- package/dist/core/tasks/plans-manager.d.ts +46 -0
- package/dist/core/tasks/plans-manager.d.ts.map +1 -0
- package/dist/core/tasks/plans-manager.js +158 -0
- package/dist/core/tasks/plans-manager.js.map +1 -0
- package/dist/core/tasks/task-manager.d.ts +127 -0
- package/dist/core/tasks/task-manager.d.ts.map +1 -0
- package/dist/core/tasks/task-manager.js +607 -0
- package/dist/core/tasks/task-manager.js.map +1 -0
- package/dist/core/workspace/project-worker.d.ts +6 -6
- package/dist/core/workspace/project-worker.d.ts.map +1 -1
- package/dist/core/workspace/project-worker.js +6 -6
- package/dist/core/workspace/project-worker.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -176
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +16 -960
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/file-search.d.ts +43 -0
- package/dist/memory/file-search.d.ts.map +1 -0
- package/dist/memory/file-search.js +228 -0
- package/dist/memory/file-search.js.map +1 -0
- package/dist/memory/file-store.d.ts +99 -0
- package/dist/memory/file-store.d.ts.map +1 -0
- package/dist/memory/file-store.js +615 -0
- package/dist/memory/file-store.js.map +1 -0
- package/dist/memory/legacy-migrator.d.ts +27 -0
- package/dist/memory/legacy-migrator.d.ts.map +1 -0
- package/dist/memory/legacy-migrator.js +185 -0
- package/dist/memory/legacy-migrator.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +25 -24
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +97 -140
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/memory-types.d.ts +1 -1
- package/dist/memory/memory-types.d.ts.map +1 -1
- package/dist/types.d.ts +8 -119
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/file-system.d.ts +22 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +31 -0
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/git-hooks.d.ts.map +1 -1
- package/dist/utils/git-hooks.js +3 -2
- package/dist/utils/git-hooks.js.map +1 -1
- package/package.json +2 -6
- package/templates/agents/context-intelligence.md +50 -52
- package/templates/cli/OPENCODE.md +85 -18
- package/templates/commands/rulebook-learn-capture.md +41 -48
- package/templates/commands/rulebook-learn-list.md +13 -13
- package/templates/core/AGENTS_LEAN.md +0 -14
- package/templates/hooks/check-context-and-handoff.sh +74 -76
- package/templates/hooks/enforce-pre-tool.sh +70 -0
- package/templates/hooks/enforce-team-for-background-agents.sh +55 -55
- package/templates/hooks/on-compact-reinject.sh +34 -34
- package/templates/hooks/resume-from-handoff.sh +61 -61
- package/templates/hooks/terse-activate.sh +197 -197
- package/templates/hooks/terse-mode-tracker.sh +190 -187
- package/templates/ides/OPENCODE.md +63 -0
- package/templates/skills/cli/opencode/SKILL.md +82 -28
- package/.claude/commands/ralph-config.md +0 -112
- package/.claude/commands/ralph-history.md +0 -110
- package/.claude/commands/ralph-init.md +0 -72
- package/.claude/commands/ralph-pause-resume.md +0 -105
- package/.claude/commands/ralph-run.md +0 -101
- package/.claude/commands/ralph-status.md +0 -76
- package/templates/core/RALPH.md +0 -471
- package/templates/frameworks/ANGULAR.md +0 -36
- package/templates/frameworks/DJANGO.md +0 -83
- package/templates/frameworks/ELECTRON.md +0 -147
- package/templates/frameworks/FLASK.md +0 -38
- package/templates/frameworks/FLUTTER.md +0 -55
- package/templates/frameworks/JQUERY.md +0 -32
- package/templates/frameworks/LARAVEL.md +0 -38
- package/templates/frameworks/NESTJS.md +0 -43
- package/templates/frameworks/NEXTJS.md +0 -127
- package/templates/frameworks/NUXT.md +0 -40
- package/templates/frameworks/RAILS.md +0 -66
- package/templates/frameworks/REACT.md +0 -38
- package/templates/frameworks/REACT_NATIVE.md +0 -47
- package/templates/frameworks/SPRING.md +0 -39
- package/templates/frameworks/SYMFONY.md +0 -36
- package/templates/frameworks/VUE.md +0 -36
- package/templates/frameworks/ZEND.md +0 -35
- package/templates/hooks/enforce-mcp-for-tasks.sh +0 -31
- package/templates/hooks/enforce-no-deferred.sh +0 -21
- package/templates/hooks/enforce-no-shortcuts.sh +0 -31
- package/templates/ides/COPILOT.md +0 -37
- package/templates/ides/CURSOR.md +0 -43
- package/templates/ides/JETBRAINS_AI.md +0 -35
- package/templates/ides/REPLIT.md +0 -36
- package/templates/ides/TABNINE.md +0 -29
- package/templates/ides/VSCODE.md +0 -40
- package/templates/ides/WINDSURF.md +0 -36
- package/templates/ides/ZED.md +0 -32
- package/templates/ides/cursor-mdc/go.mdc +0 -24
- package/templates/ides/cursor-mdc/python.mdc +0 -24
- package/templates/ides/cursor-mdc/quality.mdc +0 -25
- package/templates/ides/cursor-mdc/ralph.mdc +0 -39
- package/templates/ides/cursor-mdc/rulebook.mdc +0 -38
- package/templates/ides/cursor-mdc/rust.mdc +0 -24
- package/templates/ides/cursor-mdc/typescript.mdc +0 -25
- package/templates/ralph/ralph-history.bat +0 -4
- package/templates/ralph/ralph-history.sh +0 -5
- package/templates/ralph/ralph-init.bat +0 -5
- package/templates/ralph/ralph-init.sh +0 -5
- package/templates/ralph/ralph-pause.bat +0 -5
- package/templates/ralph/ralph-pause.sh +0 -5
- package/templates/ralph/ralph-run.bat +0 -5
- package/templates/ralph/ralph-run.sh +0 -5
- package/templates/ralph/ralph-status.bat +0 -4
- package/templates/ralph/ralph-status.sh +0 -5
- package/templates/services/AZURE_BLOB.md +0 -184
- package/templates/services/CASSANDRA.md +0 -239
- package/templates/services/DATADOG.md +0 -26
- package/templates/services/DOCKER.md +0 -124
- package/templates/services/DOCKER_COMPOSE.md +0 -168
- package/templates/services/DYNAMODB.md +0 -308
- package/templates/services/ELASTICSEARCH.md +0 -347
- package/templates/services/GCS.md +0 -178
- package/templates/services/HELM.md +0 -194
- package/templates/services/INFLUXDB.md +0 -265
- package/templates/services/KAFKA.md +0 -341
- package/templates/services/KUBERNETES.md +0 -208
- package/templates/services/MARIADB.md +0 -183
- package/templates/services/MEMCACHED.md +0 -242
- package/templates/services/MINIO.md +0 -201
- package/templates/services/MONGODB.md +0 -268
- package/templates/services/MYSQL.md +0 -358
- package/templates/services/NEO4J.md +0 -247
- package/templates/services/OPENTELEMETRY.md +0 -25
- package/templates/services/ORACLE.md +0 -290
- package/templates/services/PINO.md +0 -24
- package/templates/services/POSTGRESQL.md +0 -326
- package/templates/services/PROMETHEUS.md +0 -33
- package/templates/services/RABBITMQ.md +0 -286
- package/templates/services/REDIS.md +0 -292
- package/templates/services/S3.md +0 -298
- package/templates/services/SENTRY.md +0 -23
- package/templates/services/SQLITE.md +0 -294
- package/templates/services/SQLSERVER.md +0 -294
- package/templates/services/WINSTON.md +0 -30
- package/templates/skills/frameworks/angular/SKILL.md +0 -46
- package/templates/skills/frameworks/django/SKILL.md +0 -93
- package/templates/skills/frameworks/electron/SKILL.md +0 -157
- package/templates/skills/frameworks/flask/SKILL.md +0 -48
- package/templates/skills/frameworks/flutter/SKILL.md +0 -65
- package/templates/skills/frameworks/jquery/SKILL.md +0 -42
- package/templates/skills/frameworks/laravel/SKILL.md +0 -48
- package/templates/skills/frameworks/nestjs/SKILL.md +0 -53
- package/templates/skills/frameworks/nextjs/SKILL.md +0 -137
- package/templates/skills/frameworks/nuxt/SKILL.md +0 -50
- package/templates/skills/frameworks/rails/SKILL.md +0 -76
- package/templates/skills/frameworks/react/SKILL.md +0 -48
- package/templates/skills/frameworks/react-native/SKILL.md +0 -57
- package/templates/skills/frameworks/spring/SKILL.md +0 -49
- package/templates/skills/frameworks/symfony/SKILL.md +0 -46
- package/templates/skills/frameworks/vue/SKILL.md +0 -46
- package/templates/skills/frameworks/zend/SKILL.md +0 -45
- package/templates/skills/services/azure-blob/SKILL.md +0 -194
- package/templates/skills/services/cassandra/SKILL.md +0 -249
- package/templates/skills/services/dynamodb/SKILL.md +0 -318
- package/templates/skills/services/elasticsearch/SKILL.md +0 -357
- package/templates/skills/services/gcs/SKILL.md +0 -188
- package/templates/skills/services/influxdb/SKILL.md +0 -275
- package/templates/skills/services/kafka/SKILL.md +0 -351
- package/templates/skills/services/mariadb/SKILL.md +0 -193
- package/templates/skills/services/memcached/SKILL.md +0 -252
- package/templates/skills/services/minio/SKILL.md +0 -211
- package/templates/skills/services/mongodb/SKILL.md +0 -278
- package/templates/skills/services/mysql/SKILL.md +0 -368
- package/templates/skills/services/neo4j/SKILL.md +0 -257
- package/templates/skills/services/oracle/SKILL.md +0 -300
- package/templates/skills/services/postgresql/SKILL.md +0 -336
- package/templates/skills/services/rabbitmq/SKILL.md +0 -296
- package/templates/skills/services/redis/SKILL.md +0 -302
- package/templates/skills/services/s3/SKILL.md +0 -308
- package/templates/skills/services/sqlite/SKILL.md +0 -304
- package/templates/skills/services/sqlserver/SKILL.md +0 -304
- package/templates/skills/workflows/ralph/SETUP.md +0 -228
- package/templates/skills/workflows/ralph/SKILL.md +0 -309
- package/templates/skills/workflows/ralph/install.sh +0 -87
- package/templates/skills/workflows/ralph/manifest.json +0 -158
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
import { writeFile as fsWriteFile, existsSync, mkdirSync, readdirSync, statSync } from 'fs';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { fileExists, readFile as readFileUtil, writeFile as writeFileUtil, } from '../../utils/file-system.js';
|
|
5
|
+
const writeFileAsync = promisify(fsWriteFile);
|
|
6
|
+
const TASKS_DIR = 'tasks';
|
|
7
|
+
const ARCHIVE_DIR = 'archive';
|
|
8
|
+
const SPECS_DIR = 'specs';
|
|
9
|
+
const README_FILE = 'README.md';
|
|
10
|
+
/**
|
|
11
|
+
* Regex for phase-based task naming: phase<number>[subletter]_<version>-<description>
|
|
12
|
+
* Examples: phase0_3.1.0-volumetric-clouds, phase3a_3.24.0-lens-flare
|
|
13
|
+
*/
|
|
14
|
+
const PHASE_PREFIX_REGEX = /^phase\d+[a-z]?_/;
|
|
15
|
+
/**
|
|
16
|
+
* v5.3.0 F-NEW-3 — mandatory task tail.
|
|
17
|
+
*
|
|
18
|
+
* Every task MUST end with these three items. `createTask()` appends them
|
|
19
|
+
* automatically; `validateTask()` refuses any task that does not have them
|
|
20
|
+
* all checked; `archiveTask()` propagates that refusal.
|
|
21
|
+
*
|
|
22
|
+
* Idempotent: `renderMandatoryTail` is deterministic and `checkMandatoryTail`
|
|
23
|
+
* is case-insensitive on the leading verb so a user who rewords the items
|
|
24
|
+
* slightly (e.g. "Update docs covering the change") is still recognized.
|
|
25
|
+
*/
|
|
26
|
+
export const MANDATORY_TAIL_ITEMS = [
|
|
27
|
+
{
|
|
28
|
+
label: 'Update or create documentation covering the implementation',
|
|
29
|
+
match: /^\s*-\s*\[[ x]\]\s.*(update|create).*documentation/i,
|
|
30
|
+
},
|
|
31
|
+
{ label: 'Write tests covering the new behavior', match: /^\s*-\s*\[[ x]\]\s.*write.*tests?/i },
|
|
32
|
+
{
|
|
33
|
+
label: 'Run tests and confirm they pass',
|
|
34
|
+
match: /^\s*-\s*\[[ x]\]\s.*run.*tests?.*(pass|confirm)/i,
|
|
35
|
+
},
|
|
36
|
+
];
|
|
37
|
+
export function renderMandatoryTail(sectionNumber) {
|
|
38
|
+
return [
|
|
39
|
+
`## ${sectionNumber}. Tail (mandatory — enforced by rulebook v5.3.0)`,
|
|
40
|
+
`- [ ] ${sectionNumber}.1 Update or create documentation covering the implementation`,
|
|
41
|
+
`- [ ] ${sectionNumber}.2 Write tests covering the new behavior`,
|
|
42
|
+
`- [ ] ${sectionNumber}.3 Run tests and confirm they pass`,
|
|
43
|
+
'',
|
|
44
|
+
].join('\n');
|
|
45
|
+
}
|
|
46
|
+
export function checkMandatoryTail(tasksContent) {
|
|
47
|
+
const lines = tasksContent.split('\n');
|
|
48
|
+
const missing = [];
|
|
49
|
+
const unchecked = [];
|
|
50
|
+
for (const item of MANDATORY_TAIL_ITEMS) {
|
|
51
|
+
const matched = lines.find((line) => item.match.test(line));
|
|
52
|
+
if (!matched) {
|
|
53
|
+
missing.push(item.label);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
// Checked if the line contains `[x]` or `[X]`; unchecked otherwise.
|
|
57
|
+
if (!/\[x\]/i.test(matched)) {
|
|
58
|
+
unchecked.push(item.label);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
present: missing.length === 0,
|
|
63
|
+
missing,
|
|
64
|
+
unchecked,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export class TaskManager {
|
|
68
|
+
rulebookPath;
|
|
69
|
+
tasksPath;
|
|
70
|
+
archivePath;
|
|
71
|
+
constructor(projectRoot, rulebookDir = '.rulebook') {
|
|
72
|
+
this.rulebookPath = join(projectRoot, rulebookDir);
|
|
73
|
+
this.tasksPath = join(this.rulebookPath, TASKS_DIR);
|
|
74
|
+
this.archivePath = join(this.rulebookPath, ARCHIVE_DIR);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Initialize Rulebook tasks directory structure
|
|
78
|
+
*/
|
|
79
|
+
async initialize() {
|
|
80
|
+
if (!existsSync(this.rulebookPath)) {
|
|
81
|
+
mkdirSync(this.rulebookPath, { recursive: true });
|
|
82
|
+
}
|
|
83
|
+
if (!existsSync(this.tasksPath)) {
|
|
84
|
+
mkdirSync(this.tasksPath, { recursive: true });
|
|
85
|
+
}
|
|
86
|
+
if (!existsSync(this.archivePath)) {
|
|
87
|
+
mkdirSync(this.archivePath, { recursive: true });
|
|
88
|
+
}
|
|
89
|
+
// Auto-migrate legacy archive from tasks/archive to .rulebook/archive
|
|
90
|
+
await this.migrateArchive();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the path to a task directory
|
|
94
|
+
*/
|
|
95
|
+
getTaskPath(taskId) {
|
|
96
|
+
return join(this.tasksPath, taskId);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Validate task ID follows phase naming convention: phase<x>_<description>
|
|
100
|
+
*/
|
|
101
|
+
validateTaskId(taskId) {
|
|
102
|
+
if (!PHASE_PREFIX_REGEX.test(taskId)) {
|
|
103
|
+
return {
|
|
104
|
+
valid: false,
|
|
105
|
+
error: `Task ID "${taskId}" must start with a phase prefix (e.g., phase0_, phase1_, phase2a_). Example: phase1_add-user-auth`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return { valid: true };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Extract phase number from task ID for sorting
|
|
112
|
+
*/
|
|
113
|
+
extractPhase(taskId) {
|
|
114
|
+
const match = taskId.match(/^phase(\d+)([a-z])?_/);
|
|
115
|
+
if (!match)
|
|
116
|
+
return { phase: Infinity, subletter: '' };
|
|
117
|
+
return { phase: parseInt(match[1], 10), subletter: match[2] || '' };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a new task
|
|
121
|
+
*/
|
|
122
|
+
async createTask(taskId) {
|
|
123
|
+
await this.initialize();
|
|
124
|
+
// Validate phase naming convention
|
|
125
|
+
const nameValidation = this.validateTaskId(taskId);
|
|
126
|
+
if (!nameValidation.valid) {
|
|
127
|
+
throw new Error(nameValidation.error);
|
|
128
|
+
}
|
|
129
|
+
const taskPath = join(this.tasksPath, taskId);
|
|
130
|
+
if (existsSync(taskPath)) {
|
|
131
|
+
throw new Error(`Task ${taskId} already exists`);
|
|
132
|
+
}
|
|
133
|
+
mkdirSync(taskPath, { recursive: true });
|
|
134
|
+
mkdirSync(join(taskPath, SPECS_DIR), { recursive: true });
|
|
135
|
+
// Create proposal.md template
|
|
136
|
+
const proposalContent = `# Proposal: ${taskId}
|
|
137
|
+
|
|
138
|
+
## Why
|
|
139
|
+
[Explain why this change is needed - minimum 20 characters]
|
|
140
|
+
|
|
141
|
+
## What Changes
|
|
142
|
+
[Describe what will change]
|
|
143
|
+
|
|
144
|
+
## Impact
|
|
145
|
+
- Affected specs: [list]
|
|
146
|
+
- Affected code: [list]
|
|
147
|
+
- Breaking change: YES/NO
|
|
148
|
+
- User benefit: [describe]
|
|
149
|
+
`;
|
|
150
|
+
await writeFileAsync(join(taskPath, 'proposal.md'), proposalContent);
|
|
151
|
+
// Create tasks.md template — the MANDATORY tail items (v5.3.0 F-NEW-3)
|
|
152
|
+
// are appended automatically here AND enforced by validateTask() /
|
|
153
|
+
// archiveTask(): a task cannot be closed unless docs are updated,
|
|
154
|
+
// tests are written, and tests pass.
|
|
155
|
+
const tasksContent = `## 1. Implementation
|
|
156
|
+
- [ ] 1.1 First task
|
|
157
|
+
- [ ] 1.2 Second task
|
|
158
|
+
|
|
159
|
+
${renderMandatoryTail(2)}`;
|
|
160
|
+
await writeFileAsync(join(taskPath, 'tasks.md'), tasksContent);
|
|
161
|
+
// Create .metadata.json with initial status
|
|
162
|
+
const now = new Date().toISOString();
|
|
163
|
+
const metadata = {
|
|
164
|
+
status: 'pending',
|
|
165
|
+
createdAt: now,
|
|
166
|
+
updatedAt: now,
|
|
167
|
+
};
|
|
168
|
+
await writeFileAsync(join(taskPath, '.metadata.json'), JSON.stringify(metadata, null, 2));
|
|
169
|
+
// Update tasks README index + STATE.md
|
|
170
|
+
await this.updateReadme();
|
|
171
|
+
await this.refreshState();
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Generate and update README.md index in the tasks root directory.
|
|
175
|
+
* Groups tasks by phase and shows status, description, and progress.
|
|
176
|
+
*/
|
|
177
|
+
async updateReadme() {
|
|
178
|
+
const tasks = await this.listTasks(false);
|
|
179
|
+
// Sort tasks by phase, then by subletter, then alphabetically
|
|
180
|
+
tasks.sort((a, b) => {
|
|
181
|
+
const phaseA = this.extractPhase(a.id);
|
|
182
|
+
const phaseB = this.extractPhase(b.id);
|
|
183
|
+
if (phaseA.phase !== phaseB.phase)
|
|
184
|
+
return phaseA.phase - phaseB.phase;
|
|
185
|
+
if (phaseA.subletter !== phaseB.subletter)
|
|
186
|
+
return phaseA.subletter.localeCompare(phaseB.subletter);
|
|
187
|
+
return a.id.localeCompare(b.id);
|
|
188
|
+
});
|
|
189
|
+
// Group by phase
|
|
190
|
+
const phases = new Map();
|
|
191
|
+
for (const task of tasks) {
|
|
192
|
+
const match = task.id.match(/^(phase\d+[a-z]?)_/);
|
|
193
|
+
const phaseKey = match ? match[1] : 'unphased';
|
|
194
|
+
if (!phases.has(phaseKey))
|
|
195
|
+
phases.set(phaseKey, []);
|
|
196
|
+
phases.get(phaseKey).push(task);
|
|
197
|
+
}
|
|
198
|
+
// Calculate progress for each task from tasks.md checklist
|
|
199
|
+
const getProgress = (task) => {
|
|
200
|
+
if (!task.tasks)
|
|
201
|
+
return { done: 0, total: 0 };
|
|
202
|
+
const checked = (task.tasks.match(/- \[x\]/gi) || []).length;
|
|
203
|
+
const unchecked = (task.tasks.match(/- \[ \]/g) || []).length;
|
|
204
|
+
return { done: checked, total: checked + unchecked };
|
|
205
|
+
};
|
|
206
|
+
const statusIcon = (status) => {
|
|
207
|
+
switch (status) {
|
|
208
|
+
case 'completed':
|
|
209
|
+
return '✅';
|
|
210
|
+
case 'in-progress':
|
|
211
|
+
return '🔄';
|
|
212
|
+
case 'blocked':
|
|
213
|
+
return '🚫';
|
|
214
|
+
default:
|
|
215
|
+
return '⬚';
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
let readme = `# Tasks Index\n\n`;
|
|
219
|
+
readme += `> Auto-generated by rulebook. Do not edit manually.\n\n`;
|
|
220
|
+
const totalTasks = tasks.length;
|
|
221
|
+
const completedTasks = tasks.filter((t) => t.status === 'completed').length;
|
|
222
|
+
const inProgressTasks = tasks.filter((t) => t.status === 'in-progress').length;
|
|
223
|
+
readme += `**Total**: ${totalTasks} tasks | **Completed**: ${completedTasks} | **In Progress**: ${inProgressTasks} | **Pending**: ${totalTasks - completedTasks - inProgressTasks}\n\n`;
|
|
224
|
+
for (const [phaseKey, phaseTasks] of phases) {
|
|
225
|
+
readme += `## ${phaseKey}\n\n`;
|
|
226
|
+
readme += `| Status | Task | Progress | Description |\n`;
|
|
227
|
+
readme += `|--------|------|----------|-------------|\n`;
|
|
228
|
+
for (const task of phaseTasks) {
|
|
229
|
+
const progress = getProgress(task);
|
|
230
|
+
const progressStr = progress.total > 0 ? `${progress.done}/${progress.total}` : '-';
|
|
231
|
+
// Extract short description from task ID (after phase prefix)
|
|
232
|
+
const desc = task.id.replace(/^phase\d+[a-z]?_/, '').replace(/-/g, ' ');
|
|
233
|
+
readme += `| ${statusIcon(task.status)} | ${task.id} | ${progressStr} | ${desc} |\n`;
|
|
234
|
+
}
|
|
235
|
+
readme += `\n`;
|
|
236
|
+
}
|
|
237
|
+
await writeFileUtil(join(this.tasksPath, README_FILE), readme);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Migrate archive directory from legacy location (tasks/archive) to new location (.rulebook/archive)
|
|
241
|
+
*/
|
|
242
|
+
async migrateArchive() {
|
|
243
|
+
const legacyArchivePath = join(this.tasksPath, ARCHIVE_DIR);
|
|
244
|
+
if (!existsSync(legacyArchivePath) || !statSync(legacyArchivePath).isDirectory()) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
// Already migrated — new archive path exists and legacy also exists
|
|
248
|
+
if (!existsSync(this.archivePath)) {
|
|
249
|
+
mkdirSync(this.archivePath, { recursive: true });
|
|
250
|
+
}
|
|
251
|
+
// Move each archived task from legacy to new location
|
|
252
|
+
const entries = readdirSync(legacyArchivePath, { withFileTypes: true });
|
|
253
|
+
const { renameSync } = await import('fs');
|
|
254
|
+
for (const entry of entries) {
|
|
255
|
+
if (entry.isDirectory()) {
|
|
256
|
+
const src = join(legacyArchivePath, entry.name);
|
|
257
|
+
const dest = join(this.archivePath, entry.name);
|
|
258
|
+
if (!existsSync(dest)) {
|
|
259
|
+
renameSync(src, dest);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Remove legacy archive directory if empty
|
|
264
|
+
const remaining = readdirSync(legacyArchivePath);
|
|
265
|
+
if (remaining.length === 0) {
|
|
266
|
+
const { rmdirSync } = await import('fs');
|
|
267
|
+
rmdirSync(legacyArchivePath);
|
|
268
|
+
}
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* List all tasks
|
|
273
|
+
*/
|
|
274
|
+
async listTasks(includeArchived = false) {
|
|
275
|
+
await this.initialize();
|
|
276
|
+
const tasks = [];
|
|
277
|
+
// List active tasks
|
|
278
|
+
if (existsSync(this.tasksPath)) {
|
|
279
|
+
const entries = readdirSync(this.tasksPath, { withFileTypes: true });
|
|
280
|
+
for (const entry of entries) {
|
|
281
|
+
if (entry.isDirectory() && entry.name !== ARCHIVE_DIR) {
|
|
282
|
+
const task = await this.loadTask(entry.name);
|
|
283
|
+
if (task) {
|
|
284
|
+
tasks.push(task);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// List archived tasks if requested
|
|
290
|
+
if (includeArchived && existsSync(this.archivePath)) {
|
|
291
|
+
const archiveEntries = readdirSync(this.archivePath, { withFileTypes: true });
|
|
292
|
+
for (const entry of archiveEntries) {
|
|
293
|
+
if (entry.isDirectory()) {
|
|
294
|
+
const task = await this.loadTask(entry.name, true);
|
|
295
|
+
if (task) {
|
|
296
|
+
// Extract date from archive name (YYYY-MM-DD-task-id format)
|
|
297
|
+
const dateMatch = entry.name.match(/^(\d{4}-\d{2}-\d{2})-/);
|
|
298
|
+
if (dateMatch) {
|
|
299
|
+
task.archivedAt = dateMatch[1];
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
task.archivedAt = new Date().toISOString().split('T')[0];
|
|
303
|
+
}
|
|
304
|
+
tasks.push(task);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return tasks;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Load a task by ID
|
|
313
|
+
*/
|
|
314
|
+
async loadTask(taskId, archived = false) {
|
|
315
|
+
const basePath = archived ? this.archivePath : this.tasksPath;
|
|
316
|
+
const taskPath = join(basePath, taskId);
|
|
317
|
+
if (!existsSync(taskPath)) {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
const proposalPath = join(taskPath, 'proposal.md');
|
|
321
|
+
const tasksPath = join(taskPath, 'tasks.md');
|
|
322
|
+
const designPath = join(taskPath, 'design.md');
|
|
323
|
+
const specsPath = join(taskPath, SPECS_DIR);
|
|
324
|
+
const metadataPath = join(taskPath, '.metadata.json');
|
|
325
|
+
// Extract original task ID from archive name if archived (YYYY-MM-DD-task-id format)
|
|
326
|
+
let originalTaskId = taskId;
|
|
327
|
+
if (archived) {
|
|
328
|
+
const dateMatch = taskId.match(/^(\d{4}-\d{2}-\d{2})-(.+)$/);
|
|
329
|
+
if (dateMatch) {
|
|
330
|
+
originalTaskId = dateMatch[2];
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
const task = {
|
|
334
|
+
id: originalTaskId,
|
|
335
|
+
title: originalTaskId,
|
|
336
|
+
status: 'pending',
|
|
337
|
+
createdAt: new Date().toISOString(),
|
|
338
|
+
updatedAt: new Date().toISOString(),
|
|
339
|
+
specs: {},
|
|
340
|
+
};
|
|
341
|
+
// Load metadata (status, dates, etc.)
|
|
342
|
+
if (await fileExists(metadataPath)) {
|
|
343
|
+
try {
|
|
344
|
+
const metadata = JSON.parse(await readFileUtil(metadataPath));
|
|
345
|
+
if (metadata.status)
|
|
346
|
+
task.status = metadata.status;
|
|
347
|
+
if (metadata.createdAt)
|
|
348
|
+
task.createdAt = metadata.createdAt;
|
|
349
|
+
if (metadata.updatedAt)
|
|
350
|
+
task.updatedAt = metadata.updatedAt;
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
// Ignore invalid metadata
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Load proposal
|
|
357
|
+
if (await fileExists(proposalPath)) {
|
|
358
|
+
task.proposal = await readFileUtil(proposalPath);
|
|
359
|
+
}
|
|
360
|
+
// Load tasks
|
|
361
|
+
if (await fileExists(tasksPath)) {
|
|
362
|
+
task.tasks = await readFileUtil(tasksPath);
|
|
363
|
+
}
|
|
364
|
+
// Load design
|
|
365
|
+
if (await fileExists(designPath)) {
|
|
366
|
+
task.design = await readFileUtil(designPath);
|
|
367
|
+
}
|
|
368
|
+
// Load specs
|
|
369
|
+
if (existsSync(specsPath)) {
|
|
370
|
+
const specEntries = readdirSync(specsPath, { withFileTypes: true });
|
|
371
|
+
for (const specEntry of specEntries) {
|
|
372
|
+
if (specEntry.isDirectory()) {
|
|
373
|
+
const specFile = join(specsPath, specEntry.name, 'spec.md');
|
|
374
|
+
if (await fileExists(specFile)) {
|
|
375
|
+
task.specs[specEntry.name] = await readFileUtil(specFile);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
// Fallback to file stats for dates if metadata doesn't exist
|
|
381
|
+
if (!(await fileExists(metadataPath))) {
|
|
382
|
+
try {
|
|
383
|
+
const stats = statSync(taskPath);
|
|
384
|
+
task.createdAt = stats.birthtime.toISOString();
|
|
385
|
+
task.updatedAt = stats.mtime.toISOString();
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
// Use defaults if stats fail
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return task;
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Validate task format
|
|
395
|
+
*/
|
|
396
|
+
async validateTask(taskId) {
|
|
397
|
+
const task = await this.loadTask(taskId);
|
|
398
|
+
if (!task) {
|
|
399
|
+
return {
|
|
400
|
+
valid: false,
|
|
401
|
+
errors: [`Task ${taskId} not found`],
|
|
402
|
+
warnings: [],
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
const errors = [];
|
|
406
|
+
const warnings = [];
|
|
407
|
+
// Validate proposal
|
|
408
|
+
if (!task.proposal) {
|
|
409
|
+
errors.push('Missing proposal.md');
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
// Check Purpose section (minimum 20 characters)
|
|
413
|
+
const purposeMatch = task.proposal.match(/## Why\s*\n([\s\S]*?)(?=\n##|$)/);
|
|
414
|
+
if (!purposeMatch || purposeMatch[1].trim().length < 20) {
|
|
415
|
+
errors.push('Purpose section (## Why) must have at least 20 characters');
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// v5.3.0 F-NEW-3: mandatory task tail (docs + tests + verify)
|
|
419
|
+
const tail = task.tasks
|
|
420
|
+
? checkMandatoryTail(task.tasks)
|
|
421
|
+
: { present: false, missing: MANDATORY_TAIL_ITEMS.map((i) => i.label), unchecked: [] };
|
|
422
|
+
if (!tail.present) {
|
|
423
|
+
errors.push(`Mandatory task tail missing from tasks.md (required in v5.3.0): ${tail.missing.join(', ')}`);
|
|
424
|
+
}
|
|
425
|
+
else if (tail.unchecked.length > 0) {
|
|
426
|
+
errors.push(`Mandatory task tail items are still unchecked: ${tail.unchecked.join(', ')}`);
|
|
427
|
+
}
|
|
428
|
+
// Validate specs
|
|
429
|
+
if (!task.specs || Object.keys(task.specs).length === 0) {
|
|
430
|
+
warnings.push('No spec files found (specs/*/spec.md)');
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
for (const [module, specContent] of Object.entries(task.specs)) {
|
|
434
|
+
// Check for requirements with SHALL/MUST
|
|
435
|
+
const requirementMatches = specContent.match(/### Requirement:.*/g) || [];
|
|
436
|
+
for (const req of requirementMatches) {
|
|
437
|
+
const reqText = specContent.substring(specContent.indexOf(req));
|
|
438
|
+
const reqBody = reqText.split('\n').slice(1).join('\n').split('####')[0];
|
|
439
|
+
if (!reqBody.match(/\b(SHALL|MUST)\b/i)) {
|
|
440
|
+
errors.push(`Requirement in ${module}/spec.md missing SHALL or MUST keyword: ${req}`);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
// Check for scenarios with 4 hashtags (not 3)
|
|
444
|
+
// Only check at start of line (not in text content)
|
|
445
|
+
const scenario3Matches = specContent.match(/^### Scenario:/gm) || [];
|
|
446
|
+
if (scenario3Matches.length > 0) {
|
|
447
|
+
errors.push(`Scenarios in ${module}/spec.md must use 4 hashtags (####), not 3 (###)`);
|
|
448
|
+
}
|
|
449
|
+
// Check for Given/When/Then structure
|
|
450
|
+
const scenarios = specContent.match(/#### Scenario:[\s\S]*?(?=####|##|$)/g) || [];
|
|
451
|
+
for (const scenario of scenarios) {
|
|
452
|
+
const hasGiven = /Given/i.test(scenario);
|
|
453
|
+
const hasWhen = /When/i.test(scenario);
|
|
454
|
+
const hasThen = /Then/i.test(scenario);
|
|
455
|
+
if (!hasGiven || !hasWhen || !hasThen) {
|
|
456
|
+
warnings.push(`Scenario in ${module}/spec.md should use Given/When/Then structure`);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
return {
|
|
462
|
+
valid: errors.length === 0,
|
|
463
|
+
errors,
|
|
464
|
+
warnings,
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Archive a completed task
|
|
469
|
+
*/
|
|
470
|
+
async archiveTask(taskId, skipValidation = false) {
|
|
471
|
+
const task = await this.loadTask(taskId);
|
|
472
|
+
if (!task) {
|
|
473
|
+
throw new Error(`Task ${taskId} not found`);
|
|
474
|
+
}
|
|
475
|
+
// Validate before archiving (unless skipped)
|
|
476
|
+
if (!skipValidation) {
|
|
477
|
+
const validation = await this.validateTask(taskId);
|
|
478
|
+
if (!validation.valid) {
|
|
479
|
+
throw new Error(`Task validation failed:\n${validation.errors.join('\n')}`);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
const taskPath = join(this.tasksPath, taskId);
|
|
483
|
+
const archiveDate = new Date().toISOString().split('T')[0];
|
|
484
|
+
const archiveName = `${archiveDate}-${taskId}`;
|
|
485
|
+
const archiveTaskPath = join(this.archivePath, archiveName);
|
|
486
|
+
// Ensure archive directory exists
|
|
487
|
+
if (!existsSync(this.archivePath)) {
|
|
488
|
+
mkdirSync(this.archivePath, { recursive: true });
|
|
489
|
+
}
|
|
490
|
+
if (existsSync(archiveTaskPath)) {
|
|
491
|
+
throw new Error(`Archive ${archiveName} already exists`);
|
|
492
|
+
}
|
|
493
|
+
// Move task to archive using cross-platform filesystem operations
|
|
494
|
+
const { renameSync } = await import('fs');
|
|
495
|
+
renameSync(taskPath, archiveTaskPath);
|
|
496
|
+
// Update tasks README index + STATE.md
|
|
497
|
+
await this.updateReadme();
|
|
498
|
+
await this.refreshState();
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Update task status
|
|
502
|
+
*/
|
|
503
|
+
async updateTaskStatus(taskId, status) {
|
|
504
|
+
const task = await this.loadTask(taskId);
|
|
505
|
+
if (!task) {
|
|
506
|
+
throw new Error(`Task ${taskId} not found`);
|
|
507
|
+
}
|
|
508
|
+
task.status = status;
|
|
509
|
+
task.updatedAt = new Date().toISOString();
|
|
510
|
+
// Persist status to .metadata.json
|
|
511
|
+
const taskPath = join(this.tasksPath, taskId);
|
|
512
|
+
const metadataPath = join(taskPath, '.metadata.json');
|
|
513
|
+
const metadata = {
|
|
514
|
+
status: task.status,
|
|
515
|
+
createdAt: task.createdAt,
|
|
516
|
+
updatedAt: task.updatedAt,
|
|
517
|
+
};
|
|
518
|
+
await writeFileUtil(metadataPath, JSON.stringify(metadata, null, 2));
|
|
519
|
+
// Update tasks README index + STATE.md
|
|
520
|
+
await this.updateReadme();
|
|
521
|
+
await this.refreshState();
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* v5.3.0 F3: refresh .rulebook/STATE.md after task state changes.
|
|
525
|
+
*/
|
|
526
|
+
async refreshState() {
|
|
527
|
+
try {
|
|
528
|
+
const { writeState } = await import('../state/state-writer.js');
|
|
529
|
+
const tasks = await this.listTasks(false);
|
|
530
|
+
const active = tasks.find((t) => t.status === 'in-progress') ??
|
|
531
|
+
tasks.find((t) => t.status === 'pending') ??
|
|
532
|
+
null;
|
|
533
|
+
const totalItems = tasks.reduce((n, t) => {
|
|
534
|
+
const m = t.tasks?.match(/- \[x\]/gi);
|
|
535
|
+
const u = t.tasks?.match(/- \[ \]/g);
|
|
536
|
+
return n + (m?.length ?? 0) + (u?.length ?? 0);
|
|
537
|
+
}, 0);
|
|
538
|
+
const checkedItems = tasks.reduce((n, t) => {
|
|
539
|
+
const m = t.tasks?.match(/- \[x\]/gi);
|
|
540
|
+
return n + (m?.length ?? 0);
|
|
541
|
+
}, 0);
|
|
542
|
+
await writeState(join(this.rulebookPath, '..'), {
|
|
543
|
+
activeTask: active
|
|
544
|
+
? {
|
|
545
|
+
id: active.id,
|
|
546
|
+
phase: active.id.match(/^(phase\d+[a-z]?)_/)?.[1] ?? '?',
|
|
547
|
+
progress: `${checkedItems}/${totalItems} items`,
|
|
548
|
+
}
|
|
549
|
+
: null,
|
|
550
|
+
updatedAt: new Date().toISOString(),
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
catch {
|
|
554
|
+
// Non-fatal — STATE.md refresh must never break task operations
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Get raw task metadata (including blocks/blockedBy/cascadeImpact for v5 blocker tracking)
|
|
559
|
+
*/
|
|
560
|
+
async getTaskMetadata(taskId) {
|
|
561
|
+
const taskPath = join(this.tasksPath, taskId);
|
|
562
|
+
const metadataPath = join(taskPath, '.metadata.json');
|
|
563
|
+
if (!(await fileExists(metadataPath)))
|
|
564
|
+
return null;
|
|
565
|
+
try {
|
|
566
|
+
return JSON.parse(await readFileUtil(metadataPath));
|
|
567
|
+
}
|
|
568
|
+
catch {
|
|
569
|
+
return null;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Show task details
|
|
574
|
+
*/
|
|
575
|
+
async showTask(taskId) {
|
|
576
|
+
// Try active tasks first
|
|
577
|
+
let task = await this.loadTask(taskId, false);
|
|
578
|
+
if (task) {
|
|
579
|
+
return task;
|
|
580
|
+
}
|
|
581
|
+
// Try archived tasks
|
|
582
|
+
task = await this.loadTask(taskId, true);
|
|
583
|
+
if (task) {
|
|
584
|
+
task.archivedAt = taskId.split('-').slice(0, 3).join('-'); // Extract date from task ID
|
|
585
|
+
return task;
|
|
586
|
+
}
|
|
587
|
+
return null;
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* Delete a task permanently
|
|
591
|
+
*/
|
|
592
|
+
async deleteTask(taskId) {
|
|
593
|
+
const taskPath = join(this.tasksPath, taskId);
|
|
594
|
+
if (!existsSync(taskPath)) {
|
|
595
|
+
throw new Error(`Task ${taskId} not found`);
|
|
596
|
+
}
|
|
597
|
+
// Remove task directory recursively
|
|
598
|
+
const { rmSync } = await import('fs');
|
|
599
|
+
rmSync(taskPath, { recursive: true, force: true });
|
|
600
|
+
// Update tasks README index
|
|
601
|
+
await this.updateReadme();
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
export function createTaskManager(projectRoot, rulebookDir = '.rulebook') {
|
|
605
|
+
return new TaskManager(projectRoot, rulebookDir);
|
|
606
|
+
}
|
|
607
|
+
//# sourceMappingURL=task-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-manager.js","sourceRoot":"","sources":["../../../src/core/tasks/task-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
* Lazy-initialized: managers are created on first access.
|
|
5
5
|
* Tracks idle time for lifecycle management.
|
|
6
6
|
*/
|
|
7
|
-
import { TaskManager } from '../task-manager.js';
|
|
8
|
-
import { ConfigManager } from '../config-manager.js';
|
|
9
|
-
import { SkillsManager } from '../skills-manager.js';
|
|
10
|
-
import { DecisionManager } from '../decision-manager.js';
|
|
11
|
-
import { KnowledgeManager } from '../knowledge-manager.js';
|
|
12
|
-
import { LearnManager } from '../learn-manager.js';
|
|
7
|
+
import { TaskManager } from '../tasks/task-manager.js';
|
|
8
|
+
import { ConfigManager } from '../state/config-manager.js';
|
|
9
|
+
import { SkillsManager } from '../skills/skills-manager.js';
|
|
10
|
+
import { DecisionManager } from '../tasks/decision-manager.js';
|
|
11
|
+
import { KnowledgeManager } from '../tasks/knowledge-manager.js';
|
|
12
|
+
import { LearnManager } from '../tasks/learn-manager.js';
|
|
13
13
|
import type { RulebookConfig } from '../../types.js';
|
|
14
14
|
export declare class ProjectWorker {
|
|
15
15
|
readonly projectId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-worker.d.ts","sourceRoot":"","sources":["../../../src/core/workspace/project-worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"project-worker.d.ts","sourceRoot":"","sources":["../../../src/core/workspace/project-worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAA2B,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,qBAAa,aAAa;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,aAAa,CAEL;IAChB,OAAO,CAAC,SAAS,CAAiC;IAElD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,eAAe,CAA+B;gBAE1C,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAKlD,uDAAuD;IACvD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,6DAA6D;IAC7D,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,iDAAiD;IACjD,KAAK,IAAI,IAAI;IAIb,wEAAwE;IACxE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIlC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BjC,+DAA+D;IACzD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/B,2EAA2E;IAC3E,cAAc,IAAI,WAAW;IAM7B,gEAAgE;IAChE,gBAAgB,IAAI,OAAO,IAAI,CAAC,aAAa;IAK7C,6EAA6E;IAC7E,gBAAgB,IAAI,aAAa;IAMjC,6EAA6E;IAC7E,gBAAgB,IAAI,aAAa;IAMjC,kBAAkB,IAAI,eAAe;IAMrC,mBAAmB,IAAI,gBAAgB;IAMvC,eAAe,IAAI,YAAY;IAM/B,qEAAqE;IACrE,iBAAiB,IAAI,cAAc,GAAG,IAAI;CAG3C"}
|