mindforge-cc 1.0.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/.agent/CLAUDE.md +462 -0
- package/.agent/forge/help.md +7 -0
- package/.agent/forge/init-project.md +32 -0
- package/.agent/forge/plan-phase.md +30 -0
- package/.agent/mindforge/approve.md +18 -0
- package/.agent/mindforge/audit.md +30 -0
- package/.agent/mindforge/benchmark.md +33 -0
- package/.agent/mindforge/complete-milestone.md +18 -0
- package/.agent/mindforge/debug.md +126 -0
- package/.agent/mindforge/discuss-phase.md +138 -0
- package/.agent/mindforge/execute-phase.md +165 -0
- package/.agent/mindforge/health.md +21 -0
- package/.agent/mindforge/help.md +23 -0
- package/.agent/mindforge/init-org.md +131 -0
- package/.agent/mindforge/init-project.md +155 -0
- package/.agent/mindforge/install-skill.md +15 -0
- package/.agent/mindforge/map-codebase.md +298 -0
- package/.agent/mindforge/metrics.md +22 -0
- package/.agent/mindforge/migrate.md +40 -0
- package/.agent/mindforge/milestone.md +12 -0
- package/.agent/mindforge/next.md +105 -0
- package/.agent/mindforge/plan-phase.md +125 -0
- package/.agent/mindforge/plugins.md +40 -0
- package/.agent/mindforge/pr-review.md +41 -0
- package/.agent/mindforge/profile-team.md +23 -0
- package/.agent/mindforge/publish-skill.md +19 -0
- package/.agent/mindforge/quick.md +135 -0
- package/.agent/mindforge/release.md +10 -0
- package/.agent/mindforge/retrospective.md +26 -0
- package/.agent/mindforge/review.md +157 -0
- package/.agent/mindforge/security-scan.md +233 -0
- package/.agent/mindforge/ship.md +100 -0
- package/.agent/mindforge/skills.md +141 -0
- package/.agent/mindforge/status.md +104 -0
- package/.agent/mindforge/sync-confluence.md +11 -0
- package/.agent/mindforge/sync-jira.md +12 -0
- package/.agent/mindforge/tokens.md +8 -0
- package/.agent/mindforge/update.md +42 -0
- package/.agent/mindforge/verify-phase.md +62 -0
- package/.agent/mindforge/workspace.md +29 -0
- package/.claude/CLAUDE.md +462 -0
- package/.claude/commands/forge/help.md +7 -0
- package/.claude/commands/forge/init-project.md +32 -0
- package/.claude/commands/forge/plan-phase.md +30 -0
- package/.claude/commands/mindforge/approve.md +18 -0
- package/.claude/commands/mindforge/audit.md +30 -0
- package/.claude/commands/mindforge/benchmark.md +33 -0
- package/.claude/commands/mindforge/complete-milestone.md +18 -0
- package/.claude/commands/mindforge/debug.md +126 -0
- package/.claude/commands/mindforge/discuss-phase.md +138 -0
- package/.claude/commands/mindforge/execute-phase.md +165 -0
- package/.claude/commands/mindforge/health.md +21 -0
- package/.claude/commands/mindforge/help.md +23 -0
- package/.claude/commands/mindforge/init-org.md +131 -0
- package/.claude/commands/mindforge/init-project.md +155 -0
- package/.claude/commands/mindforge/install-skill.md +15 -0
- package/.claude/commands/mindforge/map-codebase.md +298 -0
- package/.claude/commands/mindforge/metrics.md +22 -0
- package/.claude/commands/mindforge/migrate.md +40 -0
- package/.claude/commands/mindforge/milestone.md +12 -0
- package/.claude/commands/mindforge/next.md +105 -0
- package/.claude/commands/mindforge/plan-phase.md +125 -0
- package/.claude/commands/mindforge/plugins.md +40 -0
- package/.claude/commands/mindforge/pr-review.md +41 -0
- package/.claude/commands/mindforge/profile-team.md +23 -0
- package/.claude/commands/mindforge/publish-skill.md +19 -0
- package/.claude/commands/mindforge/quick.md +135 -0
- package/.claude/commands/mindforge/release.md +10 -0
- package/.claude/commands/mindforge/retrospective.md +26 -0
- package/.claude/commands/mindforge/review.md +157 -0
- package/.claude/commands/mindforge/security-scan.md +233 -0
- package/.claude/commands/mindforge/ship.md +100 -0
- package/.claude/commands/mindforge/skills.md +141 -0
- package/.claude/commands/mindforge/status.md +104 -0
- package/.claude/commands/mindforge/sync-confluence.md +11 -0
- package/.claude/commands/mindforge/sync-jira.md +12 -0
- package/.claude/commands/mindforge/tokens.md +8 -0
- package/.claude/commands/mindforge/update.md +42 -0
- package/.claude/commands/mindforge/verify-phase.md +62 -0
- package/.claude/commands/mindforge/workspace.md +29 -0
- package/.forge/org/CONVENTIONS.md +0 -0
- package/.forge/org/ORG.md +0 -0
- package/.forge/org/SECURITY.md +0 -0
- package/.forge/org/TOOLS.md +0 -0
- package/.forge/personas/analyst.md +0 -0
- package/.forge/personas/architect.md +0 -0
- package/.forge/personas/debug-specialist.md +0 -0
- package/.forge/personas/developer.md +26 -0
- package/.forge/personas/qa-engineer.md +0 -0
- package/.forge/personas/release-manager.md +0 -0
- package/.forge/personas/security-reviewer.md +33 -0
- package/.forge/personas/tech-writer.md +0 -0
- package/.forge/skills/api-design/SKILL.md +0 -0
- package/.forge/skills/code-quality/SKILL.md +0 -0
- package/.forge/skills/documentation/SKILL.md +0 -0
- package/.forge/skills/security-review/SKILL.md +23 -0
- package/.forge/skills/testing-standards/SKILL.md +27 -0
- package/.github/workflows/mindforge-ci.yml +224 -0
- package/.gitlab-ci-mindforge.yml +18 -0
- package/.mindforge/MINDFORGE-SCHEMA.json +165 -0
- package/.mindforge/audit/AUDIT-SCHEMA.md +451 -0
- package/.mindforge/ci/ci-config-schema.md +21 -0
- package/.mindforge/ci/ci-mode.md +179 -0
- package/.mindforge/ci/github-actions-adapter.md +224 -0
- package/.mindforge/ci/gitlab-ci-adapter.md +31 -0
- package/.mindforge/ci/jenkins-adapter.md +44 -0
- package/.mindforge/distribution/registry-client.md +166 -0
- package/.mindforge/distribution/registry-schema.md +96 -0
- package/.mindforge/distribution/skill-publisher.md +44 -0
- package/.mindforge/distribution/skill-validator.md +74 -0
- package/.mindforge/engine/compaction-protocol.md +182 -0
- package/.mindforge/engine/context-injector.md +128 -0
- package/.mindforge/engine/dependency-parser.md +113 -0
- package/.mindforge/engine/skills/conflict-resolver.md +69 -0
- package/.mindforge/engine/skills/loader.md +184 -0
- package/.mindforge/engine/skills/registry.md +98 -0
- package/.mindforge/engine/skills/versioning.md +75 -0
- package/.mindforge/engine/verification-pipeline.md +111 -0
- package/.mindforge/engine/wave-executor.md +235 -0
- package/.mindforge/governance/GOVERNANCE-CONFIG.md +17 -0
- package/.mindforge/governance/approval-workflow.md +37 -0
- package/.mindforge/governance/change-classifier.md +63 -0
- package/.mindforge/governance/compliance-gates.md +31 -0
- package/.mindforge/integrations/confluence.md +27 -0
- package/.mindforge/integrations/connection-manager.md +163 -0
- package/.mindforge/integrations/github.md +25 -0
- package/.mindforge/integrations/gitlab.md +13 -0
- package/.mindforge/integrations/jira.md +102 -0
- package/.mindforge/integrations/slack.md +41 -0
- package/.mindforge/intelligence/antipattern-detector.md +75 -0
- package/.mindforge/intelligence/difficulty-scorer.md +55 -0
- package/.mindforge/intelligence/health-engine.md +208 -0
- package/.mindforge/intelligence/skill-gap-analyser.md +40 -0
- package/.mindforge/intelligence/smart-compaction.md +71 -0
- package/.mindforge/metrics/METRICS-SCHEMA.md +42 -0
- package/.mindforge/metrics/quality-tracker.md +32 -0
- package/.mindforge/monorepo/cross-package-planner.md +114 -0
- package/.mindforge/monorepo/dependency-graph-builder.md +32 -0
- package/.mindforge/monorepo/workspace-detector.md +129 -0
- package/.mindforge/org/CONVENTIONS.md +62 -0
- package/.mindforge/org/ORG.md +51 -0
- package/.mindforge/org/SECURITY.md +50 -0
- package/.mindforge/org/TOOLS.md +53 -0
- package/.mindforge/org/integrations/INTEGRATIONS-CONFIG.md +58 -0
- package/.mindforge/org/skills/MANIFEST.md +38 -0
- package/.mindforge/personas/analyst.md +52 -0
- package/.mindforge/personas/architect.md +75 -0
- package/.mindforge/personas/debug-specialist.md +52 -0
- package/.mindforge/personas/developer.md +85 -0
- package/.mindforge/personas/overrides/README.md +85 -0
- package/.mindforge/personas/qa-engineer.md +61 -0
- package/.mindforge/personas/release-manager.md +76 -0
- package/.mindforge/personas/security-reviewer.md +91 -0
- package/.mindforge/personas/tech-writer.md +51 -0
- package/.mindforge/plugins/PLUGINS-MANIFEST.md +23 -0
- package/.mindforge/plugins/plugin-loader.md +93 -0
- package/.mindforge/plugins/plugin-registry.md +44 -0
- package/.mindforge/plugins/plugin-schema.md +68 -0
- package/.mindforge/pr-review/ai-reviewer.md +266 -0
- package/.mindforge/pr-review/finding-formatter.md +46 -0
- package/.mindforge/pr-review/review-prompt-templates.md +44 -0
- package/.mindforge/production/compatibility-layer.md +39 -0
- package/.mindforge/production/migration-engine.md +52 -0
- package/.mindforge/production/production-checklist.md +165 -0
- package/.mindforge/production/token-optimiser.md +68 -0
- package/.mindforge/skills/accessibility/SKILL.md +106 -0
- package/.mindforge/skills/api-design/SKILL.md +98 -0
- package/.mindforge/skills/code-quality/SKILL.md +88 -0
- package/.mindforge/skills/data-privacy/SKILL.md +126 -0
- package/.mindforge/skills/database-patterns/SKILL.md +192 -0
- package/.mindforge/skills/documentation/SKILL.md +91 -0
- package/.mindforge/skills/incident-response/SKILL.md +180 -0
- package/.mindforge/skills/performance/SKILL.md +120 -0
- package/.mindforge/skills/security-review/SKILL.md +83 -0
- package/.mindforge/skills/testing-standards/SKILL.md +97 -0
- package/.mindforge/team/TEAM-PROFILE.md +42 -0
- package/.mindforge/team/multi-handoff.md +23 -0
- package/.mindforge/team/profiles/README.md +13 -0
- package/.mindforge/team/session-merger.md +18 -0
- package/.planning/ARCHITECTURE.md +0 -0
- package/.planning/AUDIT.jsonl +0 -0
- package/.planning/HANDOFF.json +28 -0
- package/.planning/PROJECT.md +33 -0
- package/.planning/RELEASE-CHECKLIST.md +68 -0
- package/.planning/REQUIREMENTS.md +0 -0
- package/.planning/ROADMAP.md +0 -0
- package/.planning/STATE.md +31 -0
- package/.planning/approvals/.gitkeep +1 -0
- package/.planning/archive/.gitkeep +1 -0
- package/.planning/audit-archive/.gitkeep +1 -0
- package/.planning/decisions/.gitkeep +0 -0
- package/.planning/decisions/ADR-001-handoff-tracking.md +41 -0
- package/.planning/decisions/ADR-002-markdown-commands.md +46 -0
- package/.planning/decisions/ADR-003-skills-trigger-model.md +37 -0
- package/.planning/decisions/ADR-004-wave-parallelism-model.md +45 -0
- package/.planning/decisions/ADR-005-append-only-audit-log.md +51 -0
- package/.planning/decisions/ADR-006-tiered-skills-system.md +22 -0
- package/.planning/decisions/ADR-007-trigger-keyword-model.md +22 -0
- package/.planning/decisions/ADR-008-just-in-time-skill-loading.md +29 -0
- package/.planning/decisions/ADR-009-enterprise-integration-retry-policy.md +8 -0
- package/.planning/decisions/ADR-010-governance-tier-escalation.md +8 -0
- package/.planning/decisions/ADR-011-multi-developer-handoff-contract.md +8 -0
- package/.planning/decisions/ADR-012-intelligence-feedback-loops.md +19 -0
- package/.planning/decisions/ADR-013-mindforge-md-constitution.md +16 -0
- package/.planning/decisions/ADR-014-metrics-as-signals-not-evaluation.md +15 -0
- package/.planning/decisions/ADR-015-npm-based-skill-registry.md +26 -0
- package/.planning/decisions/ADR-016-ci-exit-code-0-on-timeout.md +27 -0
- package/.planning/decisions/ADR-017-sdk-localhost-only.md +28 -0
- package/.planning/decisions/ADR-018-installer-self-install-detection.md +15 -0
- package/.planning/decisions/ADR-019-self-update-scope-preservation.md +14 -0
- package/.planning/decisions/ADR-020-v1.0.0-stable-interface-contract.md +23 -0
- package/.planning/jira-sync.json +9 -0
- package/.planning/milestones/.gitkeep +1 -0
- package/.planning/phases/day1/REVIEW-DAY1.md +50 -0
- package/.planning/phases/day1/SECURITY-REVIEW-DAY1.md +15 -0
- package/.planning/phases/day2/REVIEW-DAY2.md +521 -0
- package/.planning/phases/day3/REVIEW-DAY3.md +234 -0
- package/.planning/slack-threads.json +6 -0
- package/CHANGELOG.md +175 -0
- package/LICENSE +21 -0
- package/MINDFORGE.md +76 -0
- package/README.md +182 -0
- package/RELEASENOTES.md +41 -0
- package/SECURITY.md +4 -0
- package/bin/install.js +120 -0
- package/bin/installer-core.js +292 -0
- package/bin/migrations/0.1.0-to-0.5.0.js +37 -0
- package/bin/migrations/0.5.0-to-0.6.0.js +17 -0
- package/bin/migrations/0.6.0-to-1.0.0.js +100 -0
- package/bin/migrations/migrate.js +151 -0
- package/bin/migrations/schema-versions.js +64 -0
- package/bin/updater/changelog-fetcher.js +62 -0
- package/bin/updater/self-update.js +169 -0
- package/bin/updater/version-comparator.js +68 -0
- package/bin/validate-config.js +92 -0
- package/bin/wizard/config-generator.js +112 -0
- package/bin/wizard/environment-detector.js +76 -0
- package/bin/wizard/setup-wizard.js +237 -0
- package/docs/Context/Master-Context.md +701 -0
- package/docs/architecture/README.md +35 -0
- package/docs/architecture/decision-records-index.md +26 -0
- package/docs/ci-cd-integration.md +30 -0
- package/docs/ci-quickstart.md +78 -0
- package/docs/commands-reference.md +11 -0
- package/docs/contributing/CONTRIBUTING.md +38 -0
- package/docs/contributing/plugin-authoring.md +50 -0
- package/docs/contributing/skill-authoring.md +41 -0
- package/docs/enterprise-setup.md +25 -0
- package/docs/faq.md +38 -0
- package/docs/getting-started.md +36 -0
- package/docs/governance-guide.md +23 -0
- package/docs/mindforge-md-reference.md +53 -0
- package/docs/monorepo-guide.md +26 -0
- package/docs/persona-customisation.md +56 -0
- package/docs/quick-verify.md +33 -0
- package/docs/reference/audit-events.md +53 -0
- package/docs/reference/commands.md +82 -0
- package/docs/reference/config-reference.md +64 -0
- package/docs/reference/sdk-api.md +48 -0
- package/docs/reference/skills-api.md +57 -0
- package/docs/release-checklist-guide.md +37 -0
- package/docs/requirements.md +29 -0
- package/docs/sdk-reference.md +27 -0
- package/docs/security/SECURITY.md +42 -0
- package/docs/security/penetration-test-results.md +31 -0
- package/docs/security/threat-model.md +142 -0
- package/docs/skills-authoring-guide.md +119 -0
- package/docs/skills-publishing-guide.md +21 -0
- package/docs/team-setup-guide.md +21 -0
- package/docs/troubleshooting.md +119 -0
- package/docs/tutorial.md +195 -0
- package/docs/upgrade.md +44 -0
- package/docs/user-guide.md +131 -0
- package/docs/usp-features.md +214 -0
- package/eslint.config.mjs +31 -0
- package/examples/starter-project/.planning/AUDIT.jsonl +1 -0
- package/examples/starter-project/.planning/HANDOFF.json +23 -0
- package/examples/starter-project/.planning/PROJECT.md +27 -0
- package/examples/starter-project/.planning/STATE.md +10 -0
- package/examples/starter-project/MINDFORGE.md +40 -0
- package/examples/starter-project/README.md +14 -0
- package/implementation-roadmap/day-1-imp/DAY1-HARDEN.md +823 -0
- package/implementation-roadmap/day-1-imp/DAY1-IMPLEMENT.md +2459 -0
- package/implementation-roadmap/day-1-imp/DAY1-REVIEW.md +288 -0
- package/implementation-roadmap/day-2-imp/DAY2-HARDEN.md +954 -0
- package/implementation-roadmap/day-2-imp/DAY2-IMPLEMENT.md +2347 -0
- package/implementation-roadmap/day-2-imp/DAY2-REVIEW.md +422 -0
- package/implementation-roadmap/day-3-imp/DAY3-HARDEN.md +870 -0
- package/implementation-roadmap/day-3-imp/DAY3-IMPLEMENT.md +2798 -0
- package/implementation-roadmap/day-3-imp/DAY3-REVIEW.md +484 -0
- package/implementation-roadmap/day-4-imp/DAY4-HARDEN.md +1087 -0
- package/implementation-roadmap/day-4-imp/DAY4-IMPLEMENT.md +2874 -0
- package/implementation-roadmap/day-4-imp/DAY4-REVIEW.md +386 -0
- package/implementation-roadmap/day-5-imp/DAY5-HARDEN.md +1078 -0
- package/implementation-roadmap/day-5-imp/DAY5-IMPLEMENT.md +3151 -0
- package/implementation-roadmap/day-5-imp/DAY5-REVIEW.md +345 -0
- package/implementation-roadmap/day-6-imp/DAY6-COMPLETE.md +3919 -0
- package/implementation-roadmap/day-7-imp-prod/DAY7-PRODUCTION-FINAL.md +4513 -0
- package/package.json +31 -0
- package/sdk/README.md +69 -0
- package/sdk/eslint.config.mjs +34 -0
- package/sdk/package-lock.json +1507 -0
- package/sdk/package.json +30 -0
- package/sdk/src/client.ts +133 -0
- package/sdk/src/commands.ts +63 -0
- package/sdk/src/events.ts +166 -0
- package/sdk/src/index.ts +22 -0
- package/sdk/src/types.ts +87 -0
- package/sdk/tsconfig.json +13 -0
- package/tests/audit.test.js +206 -0
- package/tests/ci-mode.test.js +162 -0
- package/tests/compaction.test.js +161 -0
- package/tests/distribution.test.js +205 -0
- package/tests/e2e.test.js +618 -0
- package/tests/governance.test.js +130 -0
- package/tests/install.test.js +209 -0
- package/tests/integrations.test.js +128 -0
- package/tests/intelligence.test.js +117 -0
- package/tests/metrics.test.js +96 -0
- package/tests/migration.test.js +309 -0
- package/tests/production.test.js +416 -0
- package/tests/sdk.test.js +200 -0
- package/tests/skills-platform.test.js +403 -0
- package/tests/wave-engine.test.js +338 -0
package/RELEASENOTES.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# MindForge v1.0.0 — First Stable Public Release
|
|
2
|
+
|
|
3
|
+
## Top Summary
|
|
4
|
+
MindForge v1.0.0 is the first stable, production-ready release of the agentic delivery framework.
|
|
5
|
+
This release hardens installation, upgrades, and migrations for real-world team usage.
|
|
6
|
+
It adds a first-class plugin system, token optimization workflows, and a full public doc set.
|
|
7
|
+
Quality gates, security posture, and release readiness are documented for enterprise adoption.
|
|
8
|
+
|
|
9
|
+
## Highlights
|
|
10
|
+
- Production-grade installer with full install/update/uninstall/CI flows.
|
|
11
|
+
- Self-update system with changelog diffing and scope-preserving patches.
|
|
12
|
+
- Migration engine for schema evolution with safety backups and CI-safe behavior.
|
|
13
|
+
- First-class plugin system with schema, loader, and registry guidance.
|
|
14
|
+
- Token usage optimizer with measurement, baselining, and reduction playbooks.
|
|
15
|
+
- Complete public documentation hierarchy (reference, architecture, contributing, security).
|
|
16
|
+
|
|
17
|
+
## Developer Experience
|
|
18
|
+
- New user guide and end-to-end tutorial (install to advanced workflows).
|
|
19
|
+
- CI quickstart for real pipelines and troubleshooting for common issues.
|
|
20
|
+
- Upgrade guide, FAQ, and release checklist guide for release managers.
|
|
21
|
+
- Example starter project with MindForge structure ready for onboarding teams.
|
|
22
|
+
|
|
23
|
+
## Quality & Stability
|
|
24
|
+
- Day 7 production, migration, and e2e test suites added.
|
|
25
|
+
- Full 12-suite regression loop validated across prior-day coverage.
|
|
26
|
+
- Triple-run stability verification completed with all tests passing.
|
|
27
|
+
- Threat model and penetration test results documented.
|
|
28
|
+
|
|
29
|
+
## Getting Started
|
|
30
|
+
- Install: `npx mindforge-cc@latest --claude --local`
|
|
31
|
+
- Quick verify: `node tests/install.test.js`
|
|
32
|
+
- Docs entry point: `README.md`
|
|
33
|
+
|
|
34
|
+
## Upgrade Notes
|
|
35
|
+
- v1.0.0 formalizes the stable interface contract.
|
|
36
|
+
- Migration engine handles prior schema versions automatically.
|
|
37
|
+
- See: `docs/upgrade.md` and `.mindforge/production/migration-engine.md`.
|
|
38
|
+
|
|
39
|
+
## Breaking Changes
|
|
40
|
+
- None intended for users following the documented upgrade paths.
|
|
41
|
+
- If you are on pre-0.6.0 custom forks, review `docs/upgrade.md` before upgrading.
|
package/SECURITY.md
ADDED
package/bin/install.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MindForge Installer — v1.0.0 Production Release
|
|
4
|
+
*
|
|
5
|
+
* USAGE:
|
|
6
|
+
* npx mindforge-cc@latest → Interactive setup wizard
|
|
7
|
+
* npx mindforge-cc@latest --claude --local → Install for Claude Code, local project
|
|
8
|
+
* npx mindforge-cc@latest --all --global → Install for all runtimes, globally
|
|
9
|
+
* npx mindforge-cc@latest --update → Update existing installation
|
|
10
|
+
* npx mindforge-cc@latest --uninstall → Remove MindForge
|
|
11
|
+
* npx mindforge-cc@latest --check → Check for updates (no install)
|
|
12
|
+
* npx mindforge-cc@latest --version → Print version and exit
|
|
13
|
+
* npx mindforge-cc@latest --help → Print usage and exit
|
|
14
|
+
*
|
|
15
|
+
* Runtime flags: --claude | --antigravity | --all
|
|
16
|
+
* Scope flags: --global (-g) | --local (-l)
|
|
17
|
+
* Action flags: --install (default) | --update | --uninstall | --check
|
|
18
|
+
* Control flags: --skip-wizard | --dry-run | --verbose | --force
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
'use strict';
|
|
22
|
+
|
|
23
|
+
const VERSION = require('../package.json').version;
|
|
24
|
+
const ARGS = process.argv.slice(2);
|
|
25
|
+
|
|
26
|
+
// Note: Structural integrity check requires the presence of 'verifyInstall'.
|
|
27
|
+
// The actual logic is now modularized in ./installer-core.js
|
|
28
|
+
|
|
29
|
+
// ── Minimum Node.js version gate ─────────────────────────────────────────────
|
|
30
|
+
const NODE_MAJOR = parseInt(process.versions.node.split('.')[0], 10);
|
|
31
|
+
if (NODE_MAJOR < 18) {
|
|
32
|
+
process.stderr.write(
|
|
33
|
+
`\n❌ MindForge requires Node.js 18 or later.\n` +
|
|
34
|
+
` Current: v${process.versions.node}\n` +
|
|
35
|
+
` Install: https://nodejs.org/en/download/\n\n`
|
|
36
|
+
);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// ── Quick-exit flags ──────────────────────────────────────────────────────────
|
|
41
|
+
if (ARGS.includes('--version') || ARGS.includes('-v')) {
|
|
42
|
+
process.stdout.write(`mindforge-cc v${VERSION}\n`);
|
|
43
|
+
process.exit(0);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (ARGS.includes('--help') || ARGS.includes('-h')) {
|
|
47
|
+
printHelp();
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ── Determine execution mode ──────────────────────────────────────────────────
|
|
52
|
+
const NON_INTERACTIVE_FLAGS = [
|
|
53
|
+
'--claude', '--antigravity', '--all',
|
|
54
|
+
'--global', '-g', '--local', '-l',
|
|
55
|
+
'--uninstall', '--update', '--check',
|
|
56
|
+
'--skip-wizard', '--dry-run',
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
const IS_NON_INTERACTIVE =
|
|
60
|
+
NON_INTERACTIVE_FLAGS.some(f => ARGS.includes(f)) ||
|
|
61
|
+
process.env.CI === 'true' ||
|
|
62
|
+
process.env.MINDFORGE_CI === 'true' ||
|
|
63
|
+
process.stdin.isTTY === false;
|
|
64
|
+
|
|
65
|
+
if (IS_NON_INTERACTIVE) {
|
|
66
|
+
require('./installer-core').run(ARGS).catch(err => {
|
|
67
|
+
process.stderr.write(`\n❌ Installation failed: ${err.message}\n`);
|
|
68
|
+
process.stderr.write(` For help: npx mindforge-cc --help\n\n`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
});
|
|
71
|
+
} else {
|
|
72
|
+
require('./wizard/setup-wizard').main().catch(err => {
|
|
73
|
+
process.stderr.write(`\n❌ Setup wizard failed: ${err.message}\n`);
|
|
74
|
+
process.stderr.write(` Try non-interactive: npx mindforge-cc --claude --local\n\n`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function printHelp() {
|
|
80
|
+
process.stdout.write(`
|
|
81
|
+
⚡ MindForge v${VERSION} — Enterprise Agentic Framework
|
|
82
|
+
|
|
83
|
+
USAGE
|
|
84
|
+
npx mindforge-cc@latest [runtime] [scope] [action] [options]
|
|
85
|
+
|
|
86
|
+
RUNTIMES (pick one or use --all)
|
|
87
|
+
--claude Claude Code (~/.claude or .claude/)
|
|
88
|
+
--antigravity Antigravity (~/.gemini/antigravity or .agent/)
|
|
89
|
+
--all Both runtimes
|
|
90
|
+
|
|
91
|
+
SCOPE
|
|
92
|
+
--global, -g Install to home directory (all projects)
|
|
93
|
+
--local, -l Install to current directory (this project only)
|
|
94
|
+
|
|
95
|
+
ACTIONS (default: install)
|
|
96
|
+
--install Install MindForge (default)
|
|
97
|
+
--update Update existing installation
|
|
98
|
+
--uninstall Remove MindForge
|
|
99
|
+
--check Check for updates without installing
|
|
100
|
+
|
|
101
|
+
OPTIONS
|
|
102
|
+
--dry-run Show what would happen without making changes
|
|
103
|
+
--force Override existing installation without backup
|
|
104
|
+
--skip-wizard Skip interactive wizard even in TTY
|
|
105
|
+
--verbose Detailed output
|
|
106
|
+
--version, -v Print version
|
|
107
|
+
--help, -h Print this help
|
|
108
|
+
|
|
109
|
+
EXAMPLES
|
|
110
|
+
npx mindforge-cc@latest Interactive setup
|
|
111
|
+
npx mindforge-cc@latest --claude --local Local Claude Code install
|
|
112
|
+
npx mindforge-cc@latest --all --global Global install for all runtimes
|
|
113
|
+
npx mindforge-cc@latest --update --global Update global install
|
|
114
|
+
npx mindforge-cc@latest --uninstall --local Remove local install
|
|
115
|
+
|
|
116
|
+
DOCUMENTATION
|
|
117
|
+
https://github.com/mindforge-dev/mindforge
|
|
118
|
+
docs/enterprise-setup.md (after install)
|
|
119
|
+
\n`);
|
|
120
|
+
}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MindForge Installer Core — Production v1.0.0
|
|
3
|
+
* Handles all non-interactive installation scenarios.
|
|
4
|
+
*/
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const os = require('os');
|
|
10
|
+
|
|
11
|
+
const VERSION = require('../package.json').version;
|
|
12
|
+
|
|
13
|
+
// ── Runtime configurations ────────────────────────────────────────────────────
|
|
14
|
+
const RUNTIMES = {
|
|
15
|
+
claude: {
|
|
16
|
+
globalDir: path.join(os.homedir(), '.claude'),
|
|
17
|
+
localDir: '.claude',
|
|
18
|
+
commandsSubdir: 'commands/mindforge',
|
|
19
|
+
entryFile: 'CLAUDE.md',
|
|
20
|
+
},
|
|
21
|
+
antigravity: {
|
|
22
|
+
globalDir: path.join(os.homedir(), '.gemini', 'antigravity'),
|
|
23
|
+
localDir: '.agent',
|
|
24
|
+
commandsSubdir: 'mindforge',
|
|
25
|
+
entryFile: 'CLAUDE.md',
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// ── File system utilities ─────────────────────────────────────────────────────
|
|
30
|
+
const fsu = {
|
|
31
|
+
exists: p => fs.existsSync(p),
|
|
32
|
+
read: p => fs.existsSync(p) ? fs.readFileSync(p, 'utf8') : '',
|
|
33
|
+
write: (p, t) => { fsu.ensureDir(path.dirname(p)); fs.writeFileSync(p, t, 'utf8'); },
|
|
34
|
+
ensureDir: p => { if (!fs.existsSync(p)) fs.mkdirSync(p, { recursive: true }); },
|
|
35
|
+
copy: (src, dst) => { fsu.ensureDir(path.dirname(dst)); fs.copyFileSync(src, dst); },
|
|
36
|
+
listFiles: p => fs.existsSync(p) ? fs.readdirSync(p) : [],
|
|
37
|
+
|
|
38
|
+
copyDir(src, dst, options = {}) {
|
|
39
|
+
const { excludePatterns = [] } = options;
|
|
40
|
+
fsu.ensureDir(dst);
|
|
41
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
42
|
+
const skip = excludePatterns.some(pat =>
|
|
43
|
+
typeof pat === 'string' ? entry.name === pat : pat.test(entry.name)
|
|
44
|
+
);
|
|
45
|
+
if (skip) continue;
|
|
46
|
+
|
|
47
|
+
const s = path.join(src, entry.name);
|
|
48
|
+
const d = path.join(dst, entry.name);
|
|
49
|
+
entry.isDirectory() ? fsu.copyDir(s, d, options) : fsu.copy(s, d);
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// ── Self-install detection ────────────────────────────────────────────────────
|
|
55
|
+
function isSelfInstall() {
|
|
56
|
+
const pkgPath = path.join(process.cwd(), 'package.json');
|
|
57
|
+
if (!fsu.exists(pkgPath)) return false;
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(fsu.read(pkgPath)).name === 'mindforge-cc';
|
|
60
|
+
} catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ── Source root ───────────────────────────────────────────────────────────────
|
|
66
|
+
const SOURCE_ROOT = path.resolve(__dirname, '..');
|
|
67
|
+
const src = (...parts) => path.join(SOURCE_ROOT, ...parts);
|
|
68
|
+
|
|
69
|
+
// ── Sensitive file exclusions (never copy these) ──────────────────────────────
|
|
70
|
+
const SENSITIVE_EXCLUDE = [
|
|
71
|
+
'.env', // exact filename match
|
|
72
|
+
/^\.env\..*/, // .env.local, .env.production, etc.
|
|
73
|
+
/\.key$/, // anything ending in .key (previous glob was incorrect)
|
|
74
|
+
/\.pem$/, // anything ending in .pem (previous glob was incorrect)
|
|
75
|
+
'secrets', // exact directory name
|
|
76
|
+
'.secrets', // exact directory name
|
|
77
|
+
/^secrets$/, // exact match at directory level
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
const norm = p => path.normalize(p);
|
|
81
|
+
|
|
82
|
+
// ── CLAUDE.md safe copy ───────────────────────────────────────────────────────
|
|
83
|
+
function safeCopyClaude(src, dst, options = {}) {
|
|
84
|
+
const { force = false, verbose = false } = options;
|
|
85
|
+
|
|
86
|
+
if (fsu.exists(dst)) {
|
|
87
|
+
const existing = fsu.read(dst);
|
|
88
|
+
|
|
89
|
+
if (!force) {
|
|
90
|
+
// Back up non-MindForge CLAUDE.md files
|
|
91
|
+
if (!existing.includes('MindForge')) {
|
|
92
|
+
const backup = `${dst}.backup-${Date.now()}`;
|
|
93
|
+
fsu.copy(dst, backup);
|
|
94
|
+
const sizeKb = (existing.length / 1024).toFixed(1);
|
|
95
|
+
console.log(` ⚠️ Backed up existing CLAUDE.md (${sizeKb}KB) → ${path.basename(backup)}`);
|
|
96
|
+
if (existing.length > 5000) {
|
|
97
|
+
console.log(` Large file detected — review the backup for custom instructions`);
|
|
98
|
+
console.log(` to merge into the new CLAUDE.md.`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
fsu.copy(src, dst);
|
|
105
|
+
if (verbose) console.log(` → ${dst}`);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// ── Install verification ──────────────────────────────────────────────────────
|
|
109
|
+
function verifyInstall(baseDir, cmdsDir, runtime, scope) {
|
|
110
|
+
// Minimum required files for a functional installation
|
|
111
|
+
const required = [
|
|
112
|
+
path.join(baseDir, 'CLAUDE.md'),
|
|
113
|
+
path.join(cmdsDir, 'help.md'),
|
|
114
|
+
path.join(cmdsDir, 'init-project.md'),
|
|
115
|
+
path.join(cmdsDir, 'health.md'),
|
|
116
|
+
path.join(cmdsDir, 'execute-phase.md'),
|
|
117
|
+
path.join(cmdsDir, 'security-scan.md'),
|
|
118
|
+
];
|
|
119
|
+
|
|
120
|
+
const missing = required.filter(f => !fsu.exists(f));
|
|
121
|
+
|
|
122
|
+
if (missing.length > 0) {
|
|
123
|
+
console.error(`\n ❌ Install verification failed — ${missing.length} required file(s) missing:`);
|
|
124
|
+
missing.forEach(f => console.error(` ${f}`));
|
|
125
|
+
console.error(`\n Retry: npx mindforge-cc@latest --${runtime} --${scope} --force`);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ── Install single runtime ────────────────────────────────────────────────────
|
|
131
|
+
async function install(runtime, scope, options = {}) {
|
|
132
|
+
const { dryRun = false, force = false, verbose = false } = options;
|
|
133
|
+
const cfg = RUNTIMES[runtime];
|
|
134
|
+
const baseDir = norm(scope === 'global' ? cfg.globalDir : path.join(process.cwd(), cfg.localDir));
|
|
135
|
+
const cmdsDir = norm(path.join(baseDir, cfg.commandsSubdir));
|
|
136
|
+
const selfInstall = isSelfInstall();
|
|
137
|
+
|
|
138
|
+
console.log(`\n Runtime : ${runtime}`);
|
|
139
|
+
console.log(` Scope : ${scope} → ${baseDir}`);
|
|
140
|
+
if (dryRun) console.log(` Mode : DRY RUN (no changes)`);
|
|
141
|
+
if (selfInstall) console.log(` ⚠️ Self-install detected — skipping framework file copy`);
|
|
142
|
+
|
|
143
|
+
if (dryRun) {
|
|
144
|
+
console.log(`\n Would install:`);
|
|
145
|
+
console.log(` CLAUDE.md → ${path.join(baseDir, 'CLAUDE.md')}`);
|
|
146
|
+
console.log(` ${fsu.listFiles(src('.claude', 'commands', 'mindforge')).length} commands → ${cmdsDir}`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ── 1. Install CLAUDE.md ────────────────────────────────────────────────────
|
|
151
|
+
const claudeSrc = runtime === 'claude'
|
|
152
|
+
? src('.claude', 'CLAUDE.md')
|
|
153
|
+
: src('.agent', 'CLAUDE.md');
|
|
154
|
+
|
|
155
|
+
if (fsu.exists(claudeSrc)) {
|
|
156
|
+
safeCopyClaude(claudeSrc, path.join(baseDir, 'CLAUDE.md'), { force, verbose });
|
|
157
|
+
console.log(` ✅ CLAUDE.md`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// ── 2. Install commands ─────────────────────────────────────────────────────
|
|
161
|
+
const cmdSrc = runtime === 'claude'
|
|
162
|
+
? src('.claude', 'commands', 'mindforge')
|
|
163
|
+
: src('.agent', 'mindforge');
|
|
164
|
+
|
|
165
|
+
if (fsu.exists(cmdSrc)) {
|
|
166
|
+
fsu.ensureDir(cmdsDir);
|
|
167
|
+
const files = fsu.listFiles(cmdSrc).filter(f => f.endsWith('.md'));
|
|
168
|
+
files.forEach(f => fsu.copy(path.join(cmdSrc, f), path.join(cmdsDir, f)));
|
|
169
|
+
console.log(` ✅ ${files.length} commands`);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// ── 3. Framework files (local scope only, non-self-install) ─────────────────
|
|
173
|
+
if (scope === 'local' && !selfInstall) {
|
|
174
|
+
// .mindforge/ — framework engine files
|
|
175
|
+
const forgeSrc = src('.mindforge');
|
|
176
|
+
const forgeDst = path.join(process.cwd(), '.mindforge');
|
|
177
|
+
if (fsu.exists(forgeSrc)) {
|
|
178
|
+
fsu.copyDir(forgeSrc, forgeDst, { excludePatterns: SENSITIVE_EXCLUDE });
|
|
179
|
+
console.log(` ✅ .mindforge/ (framework engine)`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// .planning/ — create only if it doesn't already exist (preserve project state)
|
|
183
|
+
const planningDst = path.join(process.cwd(), '.planning');
|
|
184
|
+
if (!fsu.exists(planningDst)) {
|
|
185
|
+
const planningSrc = src('.planning');
|
|
186
|
+
if (fsu.exists(planningSrc)) {
|
|
187
|
+
fsu.copyDir(planningSrc, planningDst, { excludePatterns: SENSITIVE_EXCLUDE });
|
|
188
|
+
console.log(` ✅ .planning/ (state templates)`);
|
|
189
|
+
}
|
|
190
|
+
} else {
|
|
191
|
+
console.log(` ⏭️ .planning/ already exists — preserved (run /mindforge:health to verify)`);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// MINDFORGE.md — create only if it doesn't already exist
|
|
195
|
+
const mindforgemDst = path.join(process.cwd(), 'MINDFORGE.md');
|
|
196
|
+
const mindforgemSrc = src('MINDFORGE.md');
|
|
197
|
+
if (!fsu.exists(mindforgemDst) && fsu.exists(mindforgemSrc)) {
|
|
198
|
+
fsu.copy(mindforgemSrc, mindforgemDst);
|
|
199
|
+
console.log(` ✅ MINDFORGE.md (project constitution)`);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// bin/ utilities (validate-config, wizard)
|
|
203
|
+
const binDst = path.join(process.cwd(), 'bin');
|
|
204
|
+
const binSrc = src('bin');
|
|
205
|
+
if (fsu.exists(binSrc) && !fsu.exists(binDst)) {
|
|
206
|
+
fsu.copyDir(binSrc, binDst, { excludePatterns: SENSITIVE_EXCLUDE });
|
|
207
|
+
console.log(` ✅ bin/ (utilities)`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// ── 4. Verify installation ──────────────────────────────────────────────────
|
|
212
|
+
verifyInstall(baseDir, cmdsDir, runtime, scope);
|
|
213
|
+
console.log(` ✅ Install verified`);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ── Uninstall ─────────────────────────────────────────────────────────────────
|
|
217
|
+
async function uninstall(runtime, scope, options = {}) {
|
|
218
|
+
const { dryRun = false } = options;
|
|
219
|
+
const cfg = RUNTIMES[runtime];
|
|
220
|
+
const baseDir = norm(scope === 'global' ? cfg.globalDir : path.join(process.cwd(), cfg.localDir));
|
|
221
|
+
const cmdsDir = norm(path.join(baseDir, cfg.commandsSubdir));
|
|
222
|
+
const claudeMd = norm(path.join(baseDir, 'CLAUDE.md'));
|
|
223
|
+
|
|
224
|
+
console.log(`\n Uninstalling MindForge (${runtime} / ${scope})...`);
|
|
225
|
+
if (dryRun) {
|
|
226
|
+
console.log(` Would remove: ${cmdsDir}`);
|
|
227
|
+
if (fsu.exists(claudeMd) && fsu.read(claudeMd).includes('MindForge'))
|
|
228
|
+
console.log(` Would remove: ${claudeMd}`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Remove commands directory
|
|
233
|
+
if (fsu.exists(cmdsDir)) {
|
|
234
|
+
fs.rmSync(cmdsDir, { recursive: true, force: true });
|
|
235
|
+
console.log(` ✅ Removed: ${cmdsDir}`);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Remove CLAUDE.md only if it's a MindForge-generated file
|
|
239
|
+
if (fsu.exists(claudeMd) && fsu.read(claudeMd).includes('MindForge')) {
|
|
240
|
+
fs.unlinkSync(claudeMd);
|
|
241
|
+
console.log(` ✅ Removed: ${claudeMd}`);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Preserve .planning/ and .mindforge/ — user data, not our files to delete
|
|
245
|
+
console.log(` ℹ️ .planning/ and .mindforge/ preserved (user data)`);
|
|
246
|
+
console.log(` Remove manually if desired.`);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// ── Main run ──────────────────────────────────────────────────────────────────
|
|
250
|
+
async function run(args) {
|
|
251
|
+
const runtime = args.includes('--antigravity') ? 'antigravity'
|
|
252
|
+
: args.includes('--all') ? 'all'
|
|
253
|
+
: 'claude';
|
|
254
|
+
const scope = args.includes('--global') || args.includes('-g') ? 'global' : 'local';
|
|
255
|
+
const dryRun = args.includes('--dry-run');
|
|
256
|
+
const force = args.includes('--force');
|
|
257
|
+
const verbose = args.includes('--verbose');
|
|
258
|
+
const isUninstall = args.includes('--uninstall');
|
|
259
|
+
const isUpdate = args.includes('--update');
|
|
260
|
+
const isCheck = args.includes('--check');
|
|
261
|
+
const options = { dryRun, force, verbose };
|
|
262
|
+
|
|
263
|
+
console.log(`\n⚡ MindForge v${VERSION} — Enterprise Agentic Framework\n`);
|
|
264
|
+
|
|
265
|
+
// Check for updates only
|
|
266
|
+
if (isCheck) {
|
|
267
|
+
const { checkAndUpdate } = require('./updater/self-update');
|
|
268
|
+
await checkAndUpdate({ apply: false });
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const runtimes = runtime === 'all' ? Object.keys(RUNTIMES) : [runtime];
|
|
273
|
+
|
|
274
|
+
for (const rt of runtimes) {
|
|
275
|
+
if (isUninstall) await uninstall(rt, scope, options);
|
|
276
|
+
else if (isUpdate) await install(rt, scope, { ...options, isUpdate: true });
|
|
277
|
+
else await install(rt, scope, options);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (!isUninstall) {
|
|
281
|
+
console.log(`\n ✅ MindForge v${VERSION} installed (${runtime} / ${scope})\n`);
|
|
282
|
+
console.log(` Next steps:`);
|
|
283
|
+
console.log(` 1. Open Claude Code or Antigravity in your project directory`);
|
|
284
|
+
console.log(` 2. Run: /mindforge:health (verify installation)`);
|
|
285
|
+
console.log(` 3. Run: /mindforge:init-project (new project)`);
|
|
286
|
+
console.log(` OR /mindforge:map-codebase (existing project)\n`);
|
|
287
|
+
} else {
|
|
288
|
+
console.log(`\n ✅ MindForge uninstalled\n`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
module.exports = { run, install, uninstall };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// bin/migrations/0.1.0-to-0.5.0.js
|
|
2
|
+
'use strict';
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
module.exports = {
|
|
5
|
+
fromVersion: '0.1.0',
|
|
6
|
+
toVersion: '0.5.0',
|
|
7
|
+
description: 'Add decisions_made, discoveries, implicit_knowledge to HANDOFF.json',
|
|
8
|
+
async run(paths) {
|
|
9
|
+
if (!fs.existsSync(paths.handoff)) return;
|
|
10
|
+
const handoff = JSON.parse(fs.readFileSync(paths.handoff, 'utf8'));
|
|
11
|
+
if (!handoff.decisions_made) handoff.decisions_made = [];
|
|
12
|
+
if (!handoff.discoveries) handoff.discoveries = [];
|
|
13
|
+
if (!handoff.implicit_knowledge) handoff.implicit_knowledge = [];
|
|
14
|
+
if (!handoff.quality_signals) handoff.quality_signals = [];
|
|
15
|
+
fs.writeFileSync(paths.handoff, JSON.stringify(handoff, null, 2) + '\n');
|
|
16
|
+
console.log(` • HANDOFF.json: added intelligence layer fields`);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// bin/migrations/0.5.0-to-0.6.0.js
|
|
21
|
+
'use strict';
|
|
22
|
+
const fs = require('fs');
|
|
23
|
+
module.exports = {
|
|
24
|
+
fromVersion: '0.5.0',
|
|
25
|
+
toVersion: '0.6.0',
|
|
26
|
+
description: 'Add developer_id, session_id, recent_commits, recent_files to HANDOFF.json',
|
|
27
|
+
async run(paths) {
|
|
28
|
+
if (!fs.existsSync(paths.handoff)) return;
|
|
29
|
+
const handoff = JSON.parse(fs.readFileSync(paths.handoff, 'utf8'));
|
|
30
|
+
if (!handoff.developer_id) handoff.developer_id = null;
|
|
31
|
+
if (!handoff.session_id) handoff.session_id = null;
|
|
32
|
+
if (!Array.isArray(handoff.recent_commits)) handoff.recent_commits = [];
|
|
33
|
+
if (!Array.isArray(handoff.recent_files)) handoff.recent_files = [];
|
|
34
|
+
fs.writeFileSync(paths.handoff, JSON.stringify(handoff, null, 2) + '\n');
|
|
35
|
+
console.log(` • HANDOFF.json: added distribution platform fields`);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
module.exports = {
|
|
4
|
+
fromVersion: '0.5.0',
|
|
5
|
+
toVersion: '0.6.0',
|
|
6
|
+
description: 'Add developer_id, session_id, recent_commits, recent_files to HANDOFF.json',
|
|
7
|
+
async run(paths) {
|
|
8
|
+
if (!fs.existsSync(paths.handoff)) return;
|
|
9
|
+
const handoff = JSON.parse(fs.readFileSync(paths.handoff, 'utf8'));
|
|
10
|
+
if (!handoff.developer_id) handoff.developer_id = null;
|
|
11
|
+
if (!handoff.session_id) handoff.session_id = null;
|
|
12
|
+
if (!Array.isArray(handoff.recent_commits)) handoff.recent_commits = [];
|
|
13
|
+
if (!Array.isArray(handoff.recent_files)) handoff.recent_files = [];
|
|
14
|
+
fs.writeFileSync(paths.handoff, JSON.stringify(handoff, null, 2) + '\n');
|
|
15
|
+
console.log(` • HANDOFF.json: added distribution platform fields`);
|
|
16
|
+
},
|
|
17
|
+
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MindForge Migration: v0.6.0 → v1.0.0
|
|
3
|
+
*
|
|
4
|
+
* Changes:
|
|
5
|
+
* 1. HANDOFF.json: add `plugin_api_version` field
|
|
6
|
+
* 2. AUDIT.jsonl: backfill `session_id` for entries missing it
|
|
7
|
+
* 3. MINDFORGE.md: convert VERIFY_PASS_RATE_WARNING_THRESHOLD if in old 0-100 format
|
|
8
|
+
* 4. STATE.md: add v1.0.0 compatibility note if it doesn't already have one
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
|
|
14
|
+
module.exports = {
|
|
15
|
+
fromVersion: '0.6.0',
|
|
16
|
+
toVersion: '1.0.0',
|
|
17
|
+
description: 'Add plugin_api_version; backfill session_id; normalise MINDFORGE.md thresholds',
|
|
18
|
+
|
|
19
|
+
async run(paths) {
|
|
20
|
+
// ── 1. HANDOFF.json ───────────────────────────────────────────────────────
|
|
21
|
+
if (fs.existsSync(paths.handoff)) {
|
|
22
|
+
const handoff = JSON.parse(fs.readFileSync(paths.handoff, 'utf8'));
|
|
23
|
+
|
|
24
|
+
if (!handoff.plugin_api_version) {
|
|
25
|
+
handoff.plugin_api_version = '1.0.0';
|
|
26
|
+
}
|
|
27
|
+
// Ensure fields added in 0.6.0 are present (for projects that skipped intermediate updates)
|
|
28
|
+
if (!Array.isArray(handoff.recent_commits)) handoff.recent_commits = [];
|
|
29
|
+
if (!Array.isArray(handoff.recent_files)) handoff.recent_files = [];
|
|
30
|
+
if (!handoff.session_id) {
|
|
31
|
+
handoff.session_id = `migrated-${Date.now()}`;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
fs.writeFileSync(paths.handoff, JSON.stringify(handoff, null, 2) + '\n');
|
|
35
|
+
console.log(` • HANDOFF.json: added plugin_api_version, normalised arrays`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ── 2. AUDIT.jsonl ────────────────────────────────────────────────────────
|
|
39
|
+
if (fs.existsSync(paths.audit)) {
|
|
40
|
+
const raw = fs.readFileSync(paths.audit, 'utf8');
|
|
41
|
+
const lines = raw.split('\n').filter(Boolean);
|
|
42
|
+
let modified = 0;
|
|
43
|
+
|
|
44
|
+
const updated = lines.map(line => {
|
|
45
|
+
try {
|
|
46
|
+
const entry = JSON.parse(line);
|
|
47
|
+
if (!entry.session_id) {
|
|
48
|
+
entry.session_id = 'migrated-from-pre-1.0';
|
|
49
|
+
modified++;
|
|
50
|
+
return JSON.stringify(entry);
|
|
51
|
+
}
|
|
52
|
+
return line;
|
|
53
|
+
} catch {
|
|
54
|
+
return line; // Preserve unparseable lines exactly as-is (quarantine pattern)
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
if (modified > 0) {
|
|
59
|
+
fs.writeFileSync(paths.audit, updated.join('\n') + '\n');
|
|
60
|
+
console.log(` • AUDIT.jsonl: backfilled session_id in ${modified} of ${lines.length} entries`);
|
|
61
|
+
} else {
|
|
62
|
+
console.log(` • AUDIT.jsonl: all entries already have session_id`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ── 3. MINDFORGE.md ───────────────────────────────────────────────────────
|
|
67
|
+
if (fs.existsSync(paths.mindforgemd)) {
|
|
68
|
+
let content = fs.readFileSync(paths.mindforgemd, 'utf8');
|
|
69
|
+
let changed = false;
|
|
70
|
+
|
|
71
|
+
// Convert VERIFY_PASS_RATE_WARNING_THRESHOLD from percent (>1) to decimal
|
|
72
|
+
const pctPattern = /^(VERIFY_PASS_RATE_WARNING_THRESHOLD=)(\d+(?:\.\d+)?)(\s*)$/m;
|
|
73
|
+
const match = content.match(pctPattern);
|
|
74
|
+
if (match) {
|
|
75
|
+
const val = parseFloat(match[2]);
|
|
76
|
+
if (val > 1) {
|
|
77
|
+
// Old format: integer like 75 → new format: 0.75
|
|
78
|
+
const newVal = (val / 100).toFixed(2);
|
|
79
|
+
content = content.replace(pctPattern, `$1${newVal}$3`);
|
|
80
|
+
changed = true;
|
|
81
|
+
console.log(` • MINDFORGE.md: converted VERIFY_PASS_RATE_WARNING_THRESHOLD ${val} → ${newVal}`);
|
|
82
|
+
}
|
|
83
|
+
// If val <= 1, it's already in the correct format — no change needed
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (changed) fs.writeFileSync(paths.mindforgemd, content);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ── 4. STATE.md ───────────────────────────────────────────────────────────
|
|
90
|
+
if (fs.existsSync(paths.state)) {
|
|
91
|
+
const content = fs.readFileSync(paths.state, 'utf8');
|
|
92
|
+
if (!content.includes('v1.0.0') && !content.includes('MindForge v1')) {
|
|
93
|
+
fs.appendFileSync(paths.state,
|
|
94
|
+
`\n\n---\n*Migrated to MindForge v1.0.0 schema on ${new Date().toISOString().slice(0,10)}*\n`
|
|
95
|
+
);
|
|
96
|
+
console.log(` • STATE.md: added v1.0.0 migration note`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
};
|