javi-forge 1.2.0 → 1.4.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/ci-local/ci-local.sh +29 -9
- package/ci-local/hooks/commit-msg +0 -0
- package/ci-local/hooks/pre-commit +1 -1
- package/ci-local/hooks/pre-push +0 -0
- package/ci-local/install.sh +0 -0
- package/ci-local/lib/common.sh +183 -0
- package/dist/__integration__/helpers.d.ts +20 -0
- package/dist/__integration__/helpers.d.ts.map +1 -0
- package/dist/__integration__/helpers.js +31 -0
- package/dist/__integration__/helpers.js.map +1 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/ci.d.ts.map +1 -0
- package/dist/commands/ci.js +13 -8
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +1 -3
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +14 -6
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/llmstxt.d.ts.map +1 -0
- package/dist/commands/llmstxt.js.map +1 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/constants.d.ts +0 -4
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +0 -4
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -11
- package/dist/index.js.map +1 -0
- package/dist/lib/common.d.ts.map +1 -0
- package/dist/lib/common.js.map +1 -0
- package/dist/lib/docker.d.ts +2 -0
- package/dist/lib/docker.d.ts.map +1 -0
- package/dist/lib/docker.js +2 -1
- package/dist/lib/docker.js.map +1 -0
- package/dist/lib/frontmatter.d.ts.map +1 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/plugin.d.ts.map +1 -0
- package/dist/lib/plugin.js.map +1 -0
- package/dist/lib/template.d.ts.map +1 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/AnalyzeUI.d.ts.map +1 -0
- package/dist/ui/AnalyzeUI.js.map +1 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/CI.d.ts.map +1 -0
- package/dist/ui/CI.js.map +1 -0
- package/dist/ui/CIContext.d.ts.map +1 -0
- package/dist/ui/CIContext.js.map +1 -0
- package/dist/ui/CISelector.d.ts.map +1 -0
- package/dist/ui/CISelector.js.map +1 -0
- package/dist/ui/Doctor.d.ts.map +1 -0
- package/dist/ui/Doctor.js +1 -1
- package/dist/ui/Doctor.js.map +1 -0
- package/dist/ui/Header.d.ts.map +1 -0
- package/dist/ui/Header.js.map +1 -0
- package/dist/ui/LlmsTxt.d.ts.map +1 -0
- package/dist/ui/LlmsTxt.js.map +1 -0
- package/dist/ui/MemorySelector.d.ts.map +1 -0
- package/dist/ui/MemorySelector.js.map +1 -0
- package/dist/ui/NameInput.d.ts.map +1 -0
- package/dist/ui/NameInput.js.map +1 -0
- package/dist/ui/OptionSelector.d.ts.map +1 -0
- package/dist/ui/OptionSelector.js +1 -1
- package/dist/ui/OptionSelector.js.map +1 -0
- package/dist/ui/Plugin.d.ts.map +1 -0
- package/dist/ui/Plugin.js.map +1 -0
- package/dist/ui/Progress.d.ts.map +1 -0
- package/dist/ui/Progress.js.map +1 -0
- package/dist/ui/StackSelector.d.ts.map +1 -0
- package/dist/ui/StackSelector.js.map +1 -0
- package/dist/ui/Summary.d.ts.map +1 -0
- package/dist/ui/Summary.js.map +1 -0
- package/dist/ui/Welcome.d.ts.map +1 -0
- package/dist/ui/Welcome.js.map +1 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js.map +1 -0
- package/lib/common.sh +2 -2
- package/modules/ghagga/README.md +2 -2
- package/modules/ghagga/setup-ghagga.sh +1 -1
- package/package.json +25 -12
- package/templates/github/ci-go.yml +1 -1
- package/templates/github/ci-java.yml +2 -2
- package/templates/github/ci-node.yml +1 -1
- package/templates/github/ci-python.yml +1 -1
- package/templates/github/ci-rust.yml +1 -1
- package/templates/github/ghagga-review.yml +28 -0
- package/workflows/reusable-build-go.yml +1 -1
- package/workflows/reusable-build-java.yml +1 -1
- package/workflows/reusable-build-node.yml +1 -1
- package/workflows/reusable-build-python.yml +1 -1
- package/workflows/reusable-build-rust.yml +1 -1
- package/workflows/reusable-docker.yml +1 -1
- package/workflows/reusable-ghagga-review.yml +1 -1
- package/workflows/reusable-release.yml +1 -1
- package/.releaserc +0 -45
- package/ai-config/.skillignore +0 -15
- package/ai-config/AUTO_INVOKE.md +0 -300
- package/ai-config/agents/_TEMPLATE.md +0 -93
- package/ai-config/agents/business/api-designer.md +0 -1657
- package/ai-config/agents/business/business-analyst.md +0 -1331
- package/ai-config/agents/business/product-strategist.md +0 -206
- package/ai-config/agents/business/project-manager.md +0 -178
- package/ai-config/agents/business/requirements-analyst.md +0 -1277
- package/ai-config/agents/business/technical-writer.md +0 -1679
- package/ai-config/agents/creative/ux-designer.md +0 -205
- package/ai-config/agents/data-ai/ai-engineer.md +0 -487
- package/ai-config/agents/data-ai/analytics-engineer.md +0 -953
- package/ai-config/agents/data-ai/data-engineer.md +0 -173
- package/ai-config/agents/data-ai/data-scientist.md +0 -672
- package/ai-config/agents/data-ai/mlops-engineer.md +0 -814
- package/ai-config/agents/data-ai/prompt-engineer.md +0 -772
- package/ai-config/agents/development/angular-expert.md +0 -620
- package/ai-config/agents/development/backend-architect.md +0 -795
- package/ai-config/agents/development/database-specialist.md +0 -212
- package/ai-config/agents/development/frontend-specialist.md +0 -686
- package/ai-config/agents/development/fullstack-engineer.md +0 -668
- package/ai-config/agents/development/golang-pro.md +0 -338
- package/ai-config/agents/development/java-enterprise.md +0 -400
- package/ai-config/agents/development/javascript-pro.md +0 -422
- package/ai-config/agents/development/nextjs-pro.md +0 -474
- package/ai-config/agents/development/python-pro.md +0 -570
- package/ai-config/agents/development/react-pro.md +0 -487
- package/ai-config/agents/development/rust-pro.md +0 -246
- package/ai-config/agents/development/spring-boot-4-expert.md +0 -326
- package/ai-config/agents/development/typescript-pro.md +0 -336
- package/ai-config/agents/development/vue-specialist.md +0 -605
- package/ai-config/agents/infrastructure/cloud-architect.md +0 -472
- package/ai-config/agents/infrastructure/deployment-manager.md +0 -358
- package/ai-config/agents/infrastructure/devops-engineer.md +0 -455
- package/ai-config/agents/infrastructure/incident-responder.md +0 -519
- package/ai-config/agents/infrastructure/kubernetes-expert.md +0 -705
- package/ai-config/agents/infrastructure/monitoring-specialist.md +0 -674
- package/ai-config/agents/infrastructure/performance-engineer.md +0 -658
- package/ai-config/agents/orchestrator.md +0 -241
- package/ai-config/agents/quality/accessibility-auditor.md +0 -1204
- package/ai-config/agents/quality/code-reviewer-compact.md +0 -123
- package/ai-config/agents/quality/code-reviewer.md +0 -363
- package/ai-config/agents/quality/dependency-manager.md +0 -743
- package/ai-config/agents/quality/e2e-test-specialist.md +0 -1005
- package/ai-config/agents/quality/performance-tester.md +0 -1086
- package/ai-config/agents/quality/security-auditor.md +0 -133
- package/ai-config/agents/quality/test-engineer.md +0 -453
- package/ai-config/agents/specialists/api-designer.md +0 -87
- package/ai-config/agents/specialists/backend-architect.md +0 -73
- package/ai-config/agents/specialists/code-reviewer.md +0 -77
- package/ai-config/agents/specialists/db-optimizer.md +0 -75
- package/ai-config/agents/specialists/devops-engineer.md +0 -83
- package/ai-config/agents/specialists/documentation-writer.md +0 -78
- package/ai-config/agents/specialists/frontend-developer.md +0 -75
- package/ai-config/agents/specialists/performance-analyst.md +0 -82
- package/ai-config/agents/specialists/refactor-specialist.md +0 -74
- package/ai-config/agents/specialists/security-auditor.md +0 -74
- package/ai-config/agents/specialists/test-engineer.md +0 -81
- package/ai-config/agents/specialists/ux-consultant.md +0 -76
- package/ai-config/agents/specialized/agent-generator.md +0 -1190
- package/ai-config/agents/specialized/blockchain-developer.md +0 -149
- package/ai-config/agents/specialized/code-migrator.md +0 -892
- package/ai-config/agents/specialized/context-manager.md +0 -978
- package/ai-config/agents/specialized/documentation-writer.md +0 -1078
- package/ai-config/agents/specialized/ecommerce-expert.md +0 -1756
- package/ai-config/agents/specialized/embedded-engineer.md +0 -1714
- package/ai-config/agents/specialized/error-detective.md +0 -1034
- package/ai-config/agents/specialized/fintech-specialist.md +0 -1659
- package/ai-config/agents/specialized/freelance-project-planner-v2.md +0 -1988
- package/ai-config/agents/specialized/freelance-project-planner-v3.md +0 -2136
- package/ai-config/agents/specialized/freelance-project-planner-v4.md +0 -4503
- package/ai-config/agents/specialized/freelance-project-planner.md +0 -722
- package/ai-config/agents/specialized/game-developer.md +0 -1963
- package/ai-config/agents/specialized/healthcare-dev.md +0 -1620
- package/ai-config/agents/specialized/mobile-developer.md +0 -188
- package/ai-config/agents/specialized/parallel-plan-executor.md +0 -506
- package/ai-config/agents/specialized/plan-executor.md +0 -485
- package/ai-config/agents/specialized/solo-dev-planner-modular/00-INDEX.md +0 -485
- package/ai-config/agents/specialized/solo-dev-planner-modular/01-CORE.md +0 -3493
- package/ai-config/agents/specialized/solo-dev-planner-modular/02-SELF-CORRECTION.md +0 -778
- package/ai-config/agents/specialized/solo-dev-planner-modular/03-PROGRESSIVE-SETUP.md +0 -918
- package/ai-config/agents/specialized/solo-dev-planner-modular/04-DEPLOYMENT.md +0 -1537
- package/ai-config/agents/specialized/solo-dev-planner-modular/05-TESTING.md +0 -2633
- package/ai-config/agents/specialized/solo-dev-planner-modular/06-OPERATIONS.md +0 -5610
- package/ai-config/agents/specialized/solo-dev-planner-modular/INSTALL.md +0 -335
- package/ai-config/agents/specialized/solo-dev-planner-modular/QUICK-REFERENCE.txt +0 -215
- package/ai-config/agents/specialized/solo-dev-planner-modular/README.md +0 -260
- package/ai-config/agents/specialized/solo-dev-planner-modular/START-HERE.md +0 -379
- package/ai-config/agents/specialized/solo-dev-planner-modular/WORKFLOW-DIAGRAM.md +0 -355
- package/ai-config/agents/specialized/solo-dev-planner-modular/solo-dev-planner.md +0 -279
- package/ai-config/agents/specialized/template-writer.md +0 -347
- package/ai-config/agents/specialized/test-runner.md +0 -99
- package/ai-config/agents/specialized/vibekanban-smart-worker.md +0 -244
- package/ai-config/agents/specialized/wave-executor.md +0 -138
- package/ai-config/agents/specialized/workflow-optimizer.md +0 -1114
- package/ai-config/commands/git/changelog.md +0 -32
- package/ai-config/commands/git/ci-local.md +0 -70
- package/ai-config/commands/git/commit.md +0 -35
- package/ai-config/commands/git/fix-issue.md +0 -23
- package/ai-config/commands/git/pr-create.md +0 -42
- package/ai-config/commands/git/pr-review.md +0 -50
- package/ai-config/commands/git/worktree.md +0 -39
- package/ai-config/commands/refactoring/cleanup.md +0 -24
- package/ai-config/commands/refactoring/dead-code.md +0 -40
- package/ai-config/commands/refactoring/extract.md +0 -31
- package/ai-config/commands/testing/e2e.md +0 -30
- package/ai-config/commands/testing/tdd.md +0 -36
- package/ai-config/commands/testing/test-coverage.md +0 -30
- package/ai-config/commands/testing/test-fix.md +0 -24
- package/ai-config/commands/workflow/generate-agents-md.md +0 -85
- package/ai-config/commands/workflow/planning.md +0 -47
- package/ai-config/commands/workflows/compound.md +0 -89
- package/ai-config/commands/workflows/diagnose.md +0 -70
- package/ai-config/commands/workflows/discover.md +0 -86
- package/ai-config/commands/workflows/plan.md +0 -77
- package/ai-config/commands/workflows/review.md +0 -78
- package/ai-config/commands/workflows/work.md +0 -75
- package/ai-config/config.yaml +0 -18
- package/ai-config/hooks/_TEMPLATE.md +0 -96
- package/ai-config/hooks/block-dangerous-commands.md +0 -75
- package/ai-config/hooks/commit-guard.md +0 -90
- package/ai-config/hooks/context-loader.md +0 -73
- package/ai-config/hooks/improve-prompt.md +0 -91
- package/ai-config/hooks/learning-log.md +0 -72
- package/ai-config/hooks/model-router.md +0 -86
- package/ai-config/hooks/secret-scanner.md +0 -64
- package/ai-config/hooks/skill-validator.md +0 -102
- package/ai-config/hooks/task-artifact.md +0 -114
- package/ai-config/hooks/validate-workflow.md +0 -100
- package/ai-config/prompts/base.md +0 -71
- package/ai-config/prompts/modes/debug.md +0 -34
- package/ai-config/prompts/modes/deploy.md +0 -40
- package/ai-config/prompts/modes/research.md +0 -32
- package/ai-config/prompts/modes/review.md +0 -33
- package/ai-config/prompts/review-policy.md +0 -79
- package/ai-config/skills/_TEMPLATE.md +0 -157
- package/ai-config/skills/backend/api-gateway/SKILL.md +0 -254
- package/ai-config/skills/backend/bff-concepts/SKILL.md +0 -239
- package/ai-config/skills/backend/bff-spring/SKILL.md +0 -364
- package/ai-config/skills/backend/chi-router/SKILL.md +0 -396
- package/ai-config/skills/backend/error-handling/SKILL.md +0 -255
- package/ai-config/skills/backend/exceptions-spring/SKILL.md +0 -323
- package/ai-config/skills/backend/fastapi/SKILL.md +0 -302
- package/ai-config/skills/backend/gateway-spring/SKILL.md +0 -390
- package/ai-config/skills/backend/go-backend/SKILL.md +0 -457
- package/ai-config/skills/backend/gradle-multimodule/SKILL.md +0 -274
- package/ai-config/skills/backend/graphql-concepts/SKILL.md +0 -352
- package/ai-config/skills/backend/graphql-spring/SKILL.md +0 -398
- package/ai-config/skills/backend/grpc-concepts/SKILL.md +0 -283
- package/ai-config/skills/backend/grpc-spring/SKILL.md +0 -445
- package/ai-config/skills/backend/jwt-auth/SKILL.md +0 -412
- package/ai-config/skills/backend/notifications-concepts/SKILL.md +0 -259
- package/ai-config/skills/backend/recommendations-concepts/SKILL.md +0 -261
- package/ai-config/skills/backend/search-concepts/SKILL.md +0 -263
- package/ai-config/skills/backend/search-spring/SKILL.md +0 -375
- package/ai-config/skills/backend/spring-boot-4/SKILL.md +0 -172
- package/ai-config/skills/backend/websockets/SKILL.md +0 -532
- package/ai-config/skills/data-ai/ai-ml/SKILL.md +0 -423
- package/ai-config/skills/data-ai/analytics-concepts/SKILL.md +0 -195
- package/ai-config/skills/data-ai/analytics-spring/SKILL.md +0 -340
- package/ai-config/skills/data-ai/duckdb-analytics/SKILL.md +0 -440
- package/ai-config/skills/data-ai/langchain/SKILL.md +0 -238
- package/ai-config/skills/data-ai/mlflow/SKILL.md +0 -302
- package/ai-config/skills/data-ai/onnx-inference/SKILL.md +0 -290
- package/ai-config/skills/data-ai/powerbi/SKILL.md +0 -352
- package/ai-config/skills/data-ai/pytorch/SKILL.md +0 -274
- package/ai-config/skills/data-ai/scikit-learn/SKILL.md +0 -321
- package/ai-config/skills/data-ai/vector-db/SKILL.md +0 -301
- package/ai-config/skills/database/graph-databases/SKILL.md +0 -218
- package/ai-config/skills/database/graph-spring/SKILL.md +0 -361
- package/ai-config/skills/database/pgx-postgres/SKILL.md +0 -512
- package/ai-config/skills/database/redis-cache/SKILL.md +0 -343
- package/ai-config/skills/database/sqlite-embedded/SKILL.md +0 -388
- package/ai-config/skills/database/timescaledb/SKILL.md +0 -320
- package/ai-config/skills/docs/api-documentation/SKILL.md +0 -293
- package/ai-config/skills/docs/docs-spring/SKILL.md +0 -377
- package/ai-config/skills/docs/mustache-templates/SKILL.md +0 -190
- package/ai-config/skills/docs/technical-docs/SKILL.md +0 -447
- package/ai-config/skills/frontend/astro-ssr/SKILL.md +0 -441
- package/ai-config/skills/frontend/frontend-design/SKILL.md +0 -54
- package/ai-config/skills/frontend/frontend-web/SKILL.md +0 -368
- package/ai-config/skills/frontend/mantine-ui/SKILL.md +0 -396
- package/ai-config/skills/frontend/tanstack-query/SKILL.md +0 -439
- package/ai-config/skills/frontend/zod-validation/SKILL.md +0 -417
- package/ai-config/skills/frontend/zustand-state/SKILL.md +0 -350
- package/ai-config/skills/infrastructure/chaos-engineering/SKILL.md +0 -244
- package/ai-config/skills/infrastructure/chaos-spring/SKILL.md +0 -378
- package/ai-config/skills/infrastructure/devops-infra/SKILL.md +0 -435
- package/ai-config/skills/infrastructure/docker-containers/SKILL.md +0 -420
- package/ai-config/skills/infrastructure/kubernetes/SKILL.md +0 -456
- package/ai-config/skills/infrastructure/opentelemetry/SKILL.md +0 -546
- package/ai-config/skills/infrastructure/traefik-proxy/SKILL.md +0 -474
- package/ai-config/skills/infrastructure/woodpecker-ci/SKILL.md +0 -315
- package/ai-config/skills/mobile/ionic-capacitor/SKILL.md +0 -504
- package/ai-config/skills/mobile/mobile-ionic/SKILL.md +0 -448
- package/ai-config/skills/prompt-improver/SKILL.md +0 -125
- package/ai-config/skills/quality/ghagga-review/SKILL.md +0 -216
- package/ai-config/skills/references/hooks-patterns/SKILL.md +0 -238
- package/ai-config/skills/references/mcp-servers/SKILL.md +0 -275
- package/ai-config/skills/references/plugins-reference/SKILL.md +0 -110
- package/ai-config/skills/references/skills-reference/SKILL.md +0 -420
- package/ai-config/skills/references/subagent-templates/SKILL.md +0 -193
- package/ai-config/skills/systems-iot/modbus-protocol/SKILL.md +0 -410
- package/ai-config/skills/systems-iot/mqtt-rumqttc/SKILL.md +0 -408
- package/ai-config/skills/systems-iot/rust-systems/SKILL.md +0 -386
- package/ai-config/skills/systems-iot/tokio-async/SKILL.md +0 -324
- package/ai-config/skills/testing/playwright-e2e/SKILL.md +0 -289
- package/ai-config/skills/testing/testcontainers/SKILL.md +0 -299
- package/ai-config/skills/testing/vitest-testing/SKILL.md +0 -381
- package/ai-config/skills/workflow/ci-local-guide/SKILL.md +0 -118
- package/ai-config/skills/workflow/claude-automation-recommender/SKILL.md +0 -299
- package/ai-config/skills/workflow/claude-md-improver/SKILL.md +0 -158
- package/ai-config/skills/workflow/finishing-a-development-branch/SKILL.md +0 -117
- package/ai-config/skills/workflow/git-github/SKILL.md +0 -334
- package/ai-config/skills/workflow/git-github/references/examples.md +0 -160
- package/ai-config/skills/workflow/git-workflow/SKILL.md +0 -214
- package/ai-config/skills/workflow/ide-plugins/SKILL.md +0 -277
- package/ai-config/skills/workflow/ide-plugins-intellij/SKILL.md +0 -401
- package/ai-config/skills/workflow/obsidian-brain-workflow/SKILL.md +0 -199
- package/ai-config/skills/workflow/using-git-worktrees/SKILL.md +0 -100
- package/ai-config/skills/workflow/verification-before-completion/SKILL.md +0 -73
- package/ai-config/skills/workflow/wave-workflow/SKILL.md +0 -178
- package/dist/commands/analyze.test.d.ts +0 -2
- package/dist/commands/doctor.test.d.ts +0 -2
- package/dist/commands/init.test.d.ts +0 -2
- package/dist/commands/llmstxt.test.d.ts +0 -2
- package/dist/commands/plugin.test.d.ts +0 -2
- package/dist/commands/sync.d.ts +0 -8
- package/dist/commands/sync.js +0 -201
- package/dist/e2e/aggressive.e2e.test.d.ts +0 -2
- package/dist/e2e/commands.e2e.test.d.ts +0 -2
- package/dist/lib/common.test.d.ts +0 -2
- package/dist/lib/frontmatter.test.d.ts +0 -2
- package/dist/lib/plugin.test.d.ts +0 -2
- package/dist/lib/template.test.d.ts +0 -2
- package/dist/ui/SyncUI.d.ts +0 -10
- package/dist/ui/SyncUI.js +0 -64
- package/schemas/agent.schema.json +0 -34
- package/schemas/ai-config.schema.json +0 -28
- package/schemas/plugin.schema.json +0 -62
- package/schemas/skill.schema.json +0 -44
- package/tasks/_TEMPLATE/files-edited.md +0 -3
- package/tasks/_TEMPLATE/plan.md +0 -3
- package/tasks/_TEMPLATE/research.md +0 -3
- package/tasks/_TEMPLATE/verification.md +0 -5
package/dist/commands/sync.js
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import fs from 'fs-extra';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { ensureDirExists } from '../lib/common.js';
|
|
4
|
-
import { parseFrontmatter } from '../lib/frontmatter.js';
|
|
5
|
-
import { AI_CONFIG_DIR, AI_CLI_CONFIG_FILES, MARKER_START, MARKER_END, } from '../constants.js';
|
|
6
|
-
const ALL_TARGETS = ['claude', 'opencode', 'gemini', 'qwen', 'codex', 'copilot'];
|
|
7
|
-
function report(onStep, id, label, status, detail) {
|
|
8
|
-
onStep({ id, label, status, detail });
|
|
9
|
-
}
|
|
10
|
-
/** Read .skillignore and parse exclusion rules */
|
|
11
|
-
async function loadSkillIgnore(configDir) {
|
|
12
|
-
const globalExcludes = new Set();
|
|
13
|
-
const targetExcludes = new Map();
|
|
14
|
-
const ignorePath = path.join(configDir, '.skillignore');
|
|
15
|
-
if (!await fs.pathExists(ignorePath)) {
|
|
16
|
-
return { globalExcludes, targetExcludes };
|
|
17
|
-
}
|
|
18
|
-
const content = await fs.readFile(ignorePath, 'utf-8');
|
|
19
|
-
for (const rawLine of content.split('\n')) {
|
|
20
|
-
const line = rawLine.trim();
|
|
21
|
-
if (!line || line.startsWith('#'))
|
|
22
|
-
continue;
|
|
23
|
-
if (line.includes(':')) {
|
|
24
|
-
const [target, skill] = line.split(':', 2);
|
|
25
|
-
if (target && skill) {
|
|
26
|
-
if (!targetExcludes.has(target))
|
|
27
|
-
targetExcludes.set(target, new Set());
|
|
28
|
-
targetExcludes.get(target).add(skill);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
globalExcludes.add(line);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return { globalExcludes, targetExcludes };
|
|
36
|
-
}
|
|
37
|
-
/** Recursively collect agent/skill markdown files from a directory */
|
|
38
|
-
async function collectMarkdownEntries(baseDir, prefix = '') {
|
|
39
|
-
const entries = [];
|
|
40
|
-
if (!await fs.pathExists(baseDir))
|
|
41
|
-
return entries;
|
|
42
|
-
const items = await fs.readdir(baseDir, { withFileTypes: true });
|
|
43
|
-
for (const item of items) {
|
|
44
|
-
if (item.name.startsWith('_') || item.name.startsWith('.'))
|
|
45
|
-
continue;
|
|
46
|
-
const itemPath = path.join(baseDir, item.name);
|
|
47
|
-
const relPath = prefix ? `${prefix}/${item.name}` : item.name;
|
|
48
|
-
if (item.isDirectory()) {
|
|
49
|
-
// Look for SKILL.md or agent markdown inside
|
|
50
|
-
const skillMd = path.join(itemPath, 'SKILL.md');
|
|
51
|
-
if (await fs.pathExists(skillMd)) {
|
|
52
|
-
const content = await fs.readFile(skillMd, 'utf-8');
|
|
53
|
-
entries.push({ relativePath: relPath, name: item.name, content });
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
// Recurse into subcategory directories
|
|
57
|
-
const subEntries = await collectMarkdownEntries(itemPath, relPath);
|
|
58
|
-
entries.push(...subEntries);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
else if (item.name.endsWith('.md') && item.name !== 'README.md') {
|
|
62
|
-
const content = await fs.readFile(itemPath, 'utf-8');
|
|
63
|
-
const name = item.name.replace('.md', '');
|
|
64
|
-
entries.push({ relativePath: relPath, name, content });
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return entries;
|
|
68
|
-
}
|
|
69
|
-
/** Build a CLAUDE.md / GEMINI.md / etc from agents + skills */
|
|
70
|
-
function buildConfigContent(target, agents, skills) {
|
|
71
|
-
const lines = [];
|
|
72
|
-
lines.push(`# AI Configuration for ${target}`);
|
|
73
|
-
lines.push('');
|
|
74
|
-
lines.push(`Auto-generated by javi-forge sync. Do not edit between markers.`);
|
|
75
|
-
lines.push('');
|
|
76
|
-
if (agents.length > 0) {
|
|
77
|
-
lines.push('## Agents');
|
|
78
|
-
lines.push('');
|
|
79
|
-
for (const agent of agents) {
|
|
80
|
-
const fm = parseFrontmatter(agent.content);
|
|
81
|
-
if (fm?.data) {
|
|
82
|
-
const desc = fm.data['description'] ?? '';
|
|
83
|
-
lines.push(`- **${agent.name}**: ${desc}`);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
lines.push(`- **${agent.name}**`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
lines.push('');
|
|
90
|
-
}
|
|
91
|
-
if (skills.length > 0) {
|
|
92
|
-
lines.push('## Available Skills');
|
|
93
|
-
lines.push('');
|
|
94
|
-
for (const skill of skills) {
|
|
95
|
-
const fm = parseFrontmatter(skill.content);
|
|
96
|
-
if (fm?.data) {
|
|
97
|
-
const desc = fm.data['description'] ?? '';
|
|
98
|
-
lines.push(`- **${skill.name}**: ${desc}`);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
lines.push(`- **${skill.name}**`);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
lines.push('');
|
|
105
|
-
}
|
|
106
|
-
return lines.join('\n');
|
|
107
|
-
}
|
|
108
|
-
/** Merge generated content into an existing file using markers */
|
|
109
|
-
function mergeWithMarkers(existingContent, generatedContent) {
|
|
110
|
-
const startIdx = existingContent.indexOf(MARKER_START);
|
|
111
|
-
const endIdx = existingContent.indexOf(MARKER_END);
|
|
112
|
-
const markerBlock = `${MARKER_START}\n${generatedContent}\n${MARKER_END}`;
|
|
113
|
-
if (startIdx !== -1 && endIdx !== -1) {
|
|
114
|
-
// Replace existing marker block
|
|
115
|
-
return existingContent.slice(0, startIdx) + markerBlock + existingContent.slice(endIdx + MARKER_END.length);
|
|
116
|
-
}
|
|
117
|
-
// Append marker block
|
|
118
|
-
return existingContent.trimEnd() + '\n\n' + markerBlock + '\n';
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Sync AI config to a project directory, generating CLI-specific config files.
|
|
122
|
-
*/
|
|
123
|
-
export async function syncAIConfig(options, onStep) {
|
|
124
|
-
const { target, mode, projectDir, dryRun } = options;
|
|
125
|
-
const targets = target === 'all' ? ALL_TARGETS : [target];
|
|
126
|
-
const configDir = AI_CONFIG_DIR;
|
|
127
|
-
// Load exclusions
|
|
128
|
-
const { globalExcludes, targetExcludes } = await loadSkillIgnore(configDir);
|
|
129
|
-
// Collect agents and skills
|
|
130
|
-
const agentsDir = path.join(configDir, 'agents');
|
|
131
|
-
const skillsDir = path.join(configDir, 'skills');
|
|
132
|
-
const allAgents = await collectMarkdownEntries(agentsDir);
|
|
133
|
-
const allSkills = await collectMarkdownEntries(skillsDir);
|
|
134
|
-
for (const cli of targets) {
|
|
135
|
-
const stepId = `sync-${cli}`;
|
|
136
|
-
report(onStep, stepId, `Sync config for ${cli}`, 'running');
|
|
137
|
-
try {
|
|
138
|
-
// Filter out excluded skills
|
|
139
|
-
const cliExcludes = targetExcludes.get(cli) ?? new Set();
|
|
140
|
-
const filteredSkills = allSkills.filter(s => {
|
|
141
|
-
const nameWithoutExt = s.name;
|
|
142
|
-
const relWithoutExt = s.relativePath.replace(/\.md$/, '').replace(/\/SKILL\.md$/, '');
|
|
143
|
-
return !globalExcludes.has(nameWithoutExt)
|
|
144
|
-
&& !globalExcludes.has(relWithoutExt)
|
|
145
|
-
&& !cliExcludes.has(nameWithoutExt)
|
|
146
|
-
&& !cliExcludes.has(relWithoutExt);
|
|
147
|
-
});
|
|
148
|
-
const filteredAgents = allAgents.filter(a => {
|
|
149
|
-
return !globalExcludes.has(a.name) && !cliExcludes.has(a.name);
|
|
150
|
-
});
|
|
151
|
-
// Build the config content
|
|
152
|
-
const generatedContent = buildConfigContent(cli, filteredAgents, filteredSkills);
|
|
153
|
-
// Determine destination
|
|
154
|
-
const configFileName = AI_CLI_CONFIG_FILES[cli];
|
|
155
|
-
if (!configFileName) {
|
|
156
|
-
report(onStep, stepId, `Sync config for ${cli}`, 'skipped', 'no config file mapping');
|
|
157
|
-
continue;
|
|
158
|
-
}
|
|
159
|
-
const destPath = path.join(projectDir, configFileName);
|
|
160
|
-
if (!dryRun) {
|
|
161
|
-
await ensureDirExists(path.dirname(destPath));
|
|
162
|
-
if (mode === 'merge' && await fs.pathExists(destPath)) {
|
|
163
|
-
const existing = await fs.readFile(destPath, 'utf-8');
|
|
164
|
-
const merged = mergeWithMarkers(existing, generatedContent);
|
|
165
|
-
await fs.writeFile(destPath, merged, 'utf-8');
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
await fs.writeFile(destPath, generatedContent, 'utf-8');
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
report(onStep, stepId, `Sync config for ${cli}`, 'done', `${filteredAgents.length} agents, ${filteredSkills.length} skills → ${configFileName}`);
|
|
172
|
-
// Sync Claude commands if target is claude
|
|
173
|
-
if (cli === 'claude') {
|
|
174
|
-
const cmdStepId = `sync-${cli}-commands`;
|
|
175
|
-
report(onStep, cmdStepId, 'Sync Claude commands', 'running');
|
|
176
|
-
try {
|
|
177
|
-
const commandsSrc = path.join(configDir, 'commands');
|
|
178
|
-
if (await fs.pathExists(commandsSrc)) {
|
|
179
|
-
const commandsDest = path.join(projectDir, '.claude', 'commands');
|
|
180
|
-
if (!dryRun) {
|
|
181
|
-
await ensureDirExists(commandsDest);
|
|
182
|
-
await fs.copy(commandsSrc, commandsDest, { overwrite: true });
|
|
183
|
-
}
|
|
184
|
-
const cmdFiles = await fs.readdir(commandsSrc);
|
|
185
|
-
report(onStep, cmdStepId, 'Sync Claude commands', 'done', `${cmdFiles.length} commands`);
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
report(onStep, cmdStepId, 'Sync Claude commands', 'skipped', 'no commands dir');
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
catch (e) {
|
|
192
|
-
report(onStep, cmdStepId, 'Sync Claude commands', 'error', String(e));
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
catch (e) {
|
|
197
|
-
report(onStep, stepId, `Sync config for ${cli}`, 'error', String(e));
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
//# sourceMappingURL=sync.js.map
|
package/dist/ui/SyncUI.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import type { AI_CLI } from '../types/index.js';
|
|
3
|
-
interface Props {
|
|
4
|
-
target: AI_CLI | 'all';
|
|
5
|
-
mode: 'overwrite' | 'merge';
|
|
6
|
-
dryRun: boolean;
|
|
7
|
-
}
|
|
8
|
-
export default function SyncUI({ target, mode, dryRun }: Props): React.JSX.Element;
|
|
9
|
-
export {};
|
|
10
|
-
//# sourceMappingURL=SyncUI.d.ts.map
|
package/dist/ui/SyncUI.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useState } from 'react';
|
|
2
|
-
import { Box, Text, useApp, useInput } from 'ink';
|
|
3
|
-
import Spinner from 'ink-spinner';
|
|
4
|
-
import { syncAIConfig } from '../commands/sync.js';
|
|
5
|
-
import Header from './Header.js';
|
|
6
|
-
import { theme } from './theme.js';
|
|
7
|
-
export default function SyncUI({ target, mode, dryRun }) {
|
|
8
|
-
const { exit } = useApp();
|
|
9
|
-
const [steps, setSteps] = useState([]);
|
|
10
|
-
const [finished, setFinished] = useState(false);
|
|
11
|
-
useEffect(() => {
|
|
12
|
-
syncAIConfig({ target, mode, projectDir: process.cwd(), dryRun }, (step) => setSteps(prev => {
|
|
13
|
-
const idx = prev.findIndex(s => s.id === step.id);
|
|
14
|
-
if (idx >= 0) {
|
|
15
|
-
const next = [...prev];
|
|
16
|
-
next[idx] = step;
|
|
17
|
-
return next;
|
|
18
|
-
}
|
|
19
|
-
return [...prev, step];
|
|
20
|
-
})).then(() => setFinished(true));
|
|
21
|
-
}, [target, mode, dryRun]);
|
|
22
|
-
useInput((_, key) => {
|
|
23
|
-
if (finished && (key.return || key.escape))
|
|
24
|
-
exit();
|
|
25
|
-
});
|
|
26
|
-
const done = steps.filter(s => s.status === 'done').length;
|
|
27
|
-
const errors = steps.filter(s => s.status === 'error').length;
|
|
28
|
-
return (React.createElement(Box, { flexDirection: "column", padding: 1 },
|
|
29
|
-
React.createElement(Header, { subtitle: "sync", dryRun: dryRun }),
|
|
30
|
-
React.createElement(Box, { flexDirection: "column" }, steps.map(step => (React.createElement(Box, { key: step.id, marginLeft: 2 }, step.status === 'running' ? (React.createElement(Text, { color: theme.warning },
|
|
31
|
-
React.createElement(Spinner, { type: "dots" }),
|
|
32
|
-
' ',
|
|
33
|
-
step.label)) : step.status === 'done' ? (React.createElement(Text, { color: theme.success },
|
|
34
|
-
'\u2713',
|
|
35
|
-
" ",
|
|
36
|
-
step.label,
|
|
37
|
-
step.detail && React.createElement(Text, { color: theme.muted, dimColor: true },
|
|
38
|
-
" ",
|
|
39
|
-
step.detail))) : step.status === 'error' ? (React.createElement(Text, { color: theme.error },
|
|
40
|
-
'\u2717',
|
|
41
|
-
" ",
|
|
42
|
-
step.label,
|
|
43
|
-
step.detail && React.createElement(Text, { color: theme.muted, dimColor: true },
|
|
44
|
-
" ",
|
|
45
|
-
step.detail))) : (React.createElement(Text, { color: theme.muted },
|
|
46
|
-
'\u2013',
|
|
47
|
-
" ",
|
|
48
|
-
step.label,
|
|
49
|
-
step.detail && React.createElement(Text, { dimColor: true },
|
|
50
|
-
" ",
|
|
51
|
-
step.detail))))))),
|
|
52
|
-
finished && (React.createElement(Box, { marginTop: 1, flexDirection: "column" },
|
|
53
|
-
React.createElement(Text, { bold: true, color: errors > 0 ? theme.warning : theme.success },
|
|
54
|
-
dryRun ? '\u25cb Dry run complete' : '\u2713 Sync complete',
|
|
55
|
-
' ',
|
|
56
|
-
"(",
|
|
57
|
-
done,
|
|
58
|
-
" done",
|
|
59
|
-
errors > 0 ? `, ${errors} errors` : '',
|
|
60
|
-
")"),
|
|
61
|
-
React.createElement(Box, { marginTop: 1 },
|
|
62
|
-
React.createElement(Text, { color: theme.muted, dimColor: true }, "Press Enter to exit"))))));
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=SyncUI.js.map
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"title": "Agent frontmatter",
|
|
4
|
-
"description": "Schema for AI agent frontmatter in project-starter-framework",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"required": ["name", "description"],
|
|
7
|
-
"additionalProperties": true,
|
|
8
|
-
"properties": {
|
|
9
|
-
"name": {
|
|
10
|
-
"type": "string",
|
|
11
|
-
"description": "Unique agent identifier in kebab-case",
|
|
12
|
-
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
|
|
13
|
-
"minLength": 2,
|
|
14
|
-
"maxLength": 60
|
|
15
|
-
},
|
|
16
|
-
"description": {
|
|
17
|
-
"type": "string",
|
|
18
|
-
"description": "What the agent does and when to use it",
|
|
19
|
-
"minLength": 10
|
|
20
|
-
},
|
|
21
|
-
"model": {
|
|
22
|
-
"type": "string",
|
|
23
|
-
"description": "Preferred model for this agent (optional)"
|
|
24
|
-
},
|
|
25
|
-
"tools": {
|
|
26
|
-
"description": "List of tools this agent uses",
|
|
27
|
-
"oneOf": [
|
|
28
|
-
{ "type": "array", "items": { "type": "string" } },
|
|
29
|
-
{ "type": "string" },
|
|
30
|
-
{ "type": "null" }
|
|
31
|
-
]
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"title": "AI Config",
|
|
4
|
-
"description": "Schema for .ai-config/config.yaml",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"properties": {
|
|
7
|
-
"targets": {
|
|
8
|
-
"type": "array",
|
|
9
|
-
"description": "Targets to sync when running sync-ai-config.sh without arguments",
|
|
10
|
-
"items": {
|
|
11
|
-
"type": "string",
|
|
12
|
-
"enum": ["claude", "opencode", "cursor", "aider", "gemini", "continue"]
|
|
13
|
-
},
|
|
14
|
-
"uniqueItems": true,
|
|
15
|
-
"minItems": 1
|
|
16
|
-
},
|
|
17
|
-
"sync": {
|
|
18
|
-
"type": "object",
|
|
19
|
-
"properties": {
|
|
20
|
-
"claude_mode": {
|
|
21
|
-
"type": "string",
|
|
22
|
-
"enum": ["overwrite", "merge"],
|
|
23
|
-
"default": "overwrite"
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"title": "Plugin manifest",
|
|
4
|
-
"description": "Schema for javi-forge plugin.json manifest",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"required": ["name", "version", "description"],
|
|
7
|
-
"additionalProperties": false,
|
|
8
|
-
"properties": {
|
|
9
|
-
"name": {
|
|
10
|
-
"type": "string",
|
|
11
|
-
"description": "Unique plugin identifier in kebab-case",
|
|
12
|
-
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
|
|
13
|
-
"minLength": 2,
|
|
14
|
-
"maxLength": 60
|
|
15
|
-
},
|
|
16
|
-
"version": {
|
|
17
|
-
"type": "string",
|
|
18
|
-
"description": "Semver version string",
|
|
19
|
-
"pattern": "^\\d+\\.\\d+\\.\\d+$"
|
|
20
|
-
},
|
|
21
|
-
"description": {
|
|
22
|
-
"type": "string",
|
|
23
|
-
"description": "Short description of what the plugin provides",
|
|
24
|
-
"minLength": 10,
|
|
25
|
-
"maxLength": 200
|
|
26
|
-
},
|
|
27
|
-
"author": {
|
|
28
|
-
"type": "string",
|
|
29
|
-
"description": "Plugin author or organization"
|
|
30
|
-
},
|
|
31
|
-
"repository": {
|
|
32
|
-
"type": "string",
|
|
33
|
-
"description": "GitHub repository URL (e.g. https://github.com/org/repo)"
|
|
34
|
-
},
|
|
35
|
-
"skills": {
|
|
36
|
-
"type": "array",
|
|
37
|
-
"description": "Skill directories included in this plugin",
|
|
38
|
-
"items": { "type": "string" }
|
|
39
|
-
},
|
|
40
|
-
"commands": {
|
|
41
|
-
"type": "array",
|
|
42
|
-
"description": "Command definitions included in this plugin",
|
|
43
|
-
"items": { "type": "string" }
|
|
44
|
-
},
|
|
45
|
-
"hooks": {
|
|
46
|
-
"type": "array",
|
|
47
|
-
"description": "Hook definitions included in this plugin",
|
|
48
|
-
"items": { "type": "string" }
|
|
49
|
-
},
|
|
50
|
-
"agents": {
|
|
51
|
-
"type": "array",
|
|
52
|
-
"description": "Agent definitions included in this plugin",
|
|
53
|
-
"items": { "type": "string" }
|
|
54
|
-
},
|
|
55
|
-
"tags": {
|
|
56
|
-
"type": "array",
|
|
57
|
-
"description": "Searchable tags for plugin discovery",
|
|
58
|
-
"items": { "type": "string" },
|
|
59
|
-
"maxItems": 10
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"title": "SKILL.md frontmatter",
|
|
4
|
-
"description": "Schema for AI skill frontmatter in project-starter-framework",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"required": ["name", "description"],
|
|
7
|
-
"additionalProperties": true,
|
|
8
|
-
"properties": {
|
|
9
|
-
"name": {
|
|
10
|
-
"type": "string",
|
|
11
|
-
"description": "Unique skill identifier in kebab-case",
|
|
12
|
-
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
|
|
13
|
-
"minLength": 2,
|
|
14
|
-
"maxLength": 60
|
|
15
|
-
},
|
|
16
|
-
"description": {
|
|
17
|
-
"type": "string",
|
|
18
|
-
"description": "Short description. Should include 'Trigger:' hint for auto-invoke.",
|
|
19
|
-
"minLength": 10
|
|
20
|
-
},
|
|
21
|
-
"metadata": {
|
|
22
|
-
"description": "Optional skill metadata",
|
|
23
|
-
"oneOf": [
|
|
24
|
-
{
|
|
25
|
-
"type": "object",
|
|
26
|
-
"properties": {
|
|
27
|
-
"author": { "type": "string" },
|
|
28
|
-
"version": {
|
|
29
|
-
"type": "string",
|
|
30
|
-
"pattern": "^\\d+\\.\\d+(\\.\\d+)?$"
|
|
31
|
-
},
|
|
32
|
-
"tags": {
|
|
33
|
-
"type": "array",
|
|
34
|
-
"items": { "type": "string" }
|
|
35
|
-
},
|
|
36
|
-
"category": { "type": "string" }
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
{ "type": "string" },
|
|
40
|
-
{ "type": "null" }
|
|
41
|
-
]
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
package/tasks/_TEMPLATE/plan.md
DELETED