forgehive 1.0.3 → 1.0.5

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.
Files changed (2) hide show
  1. package/dist/cli.js +316 -17
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -9450,13 +9450,314 @@ async function promptConfirm(question) {
9450
9450
  });
9451
9451
  });
9452
9452
  }
9453
+ var ANSI = { bold: "\x1B[1m", dim: "\x1B[2m", reset: "\x1B[0m" };
9454
+ var CAP_DISPLAY = {
9455
+ // Sprache
9456
+ javascript: "JavaScript",
9457
+ typescript: "TypeScript",
9458
+ python: "Python",
9459
+ rust: "Rust",
9460
+ golang: "Go",
9461
+ java: "Java",
9462
+ kotlin: "Kotlin",
9463
+ scala: "Scala",
9464
+ ruby: "Ruby",
9465
+ php: "PHP",
9466
+ csharp: "C#",
9467
+ fsharp: "F#",
9468
+ vbnet: "VB.NET",
9469
+ swift: "Swift",
9470
+ dart: "Dart",
9471
+ elixir: "Elixir",
9472
+ crystal: "Crystal",
9473
+ zig: "Zig",
9474
+ nim: "Nim",
9475
+ perl: "Perl",
9476
+ cpp: "C++",
9477
+ cmake: "CMake",
9478
+ // Runtime
9479
+ nodejs: "Node.js",
9480
+ dotnet: ".NET",
9481
+ jvm: "JVM",
9482
+ flutter: "Flutter",
9483
+ // Framework
9484
+ react: "React",
9485
+ nextjs: "Next.js",
9486
+ vue: "Vue",
9487
+ nuxt: "Nuxt",
9488
+ svelte: "Svelte",
9489
+ sveltekit: "SvelteKit",
9490
+ angular: "Angular",
9491
+ remix: "Remix",
9492
+ astro: "Astro",
9493
+ gatsby: "Gatsby",
9494
+ qwik: "Qwik",
9495
+ solidjs: "SolidJS",
9496
+ express: "Express",
9497
+ fastify: "Fastify",
9498
+ nestjs: "NestJS",
9499
+ hono: "Hono",
9500
+ koa: "Koa",
9501
+ hapi: "Hapi",
9502
+ feathers: "Feathers",
9503
+ fastapi: "FastAPI",
9504
+ django: "Django",
9505
+ flask: "Flask",
9506
+ starlette: "Starlette",
9507
+ tornado: "Tornado",
9508
+ litestar: "Litestar",
9509
+ rails: "Rails",
9510
+ sinatra: "Sinatra",
9511
+ grape: "Grape",
9512
+ hanami: "Hanami",
9513
+ "spring-boot": "Spring Boot",
9514
+ "spring-web": "Spring Web",
9515
+ quarkus: "Quarkus",
9516
+ micronaut: "Micronaut",
9517
+ ktor: "Ktor",
9518
+ phoenix: "Phoenix",
9519
+ axum: "Axum",
9520
+ "actix-web": "Actix Web",
9521
+ warp: "Warp",
9522
+ rocket: "Rocket",
9523
+ poem: "Poem",
9524
+ gin: "Gin",
9525
+ echo: "Echo",
9526
+ fiber: "Fiber",
9527
+ chi: "Chi",
9528
+ "gorilla-mux": "Gorilla Mux",
9529
+ wpf: "WPF",
9530
+ avalonia: "Avalonia",
9531
+ maui: "MAUI",
9532
+ blazor: "Blazor",
9533
+ "uno-platform": "Uno Platform",
9534
+ liveview: "LiveView",
9535
+ mvvm: "MVVM",
9536
+ carter: "Carter",
9537
+ fastendpoints: "FastEndpoints",
9538
+ // ORM / DB
9539
+ prisma: "Prisma",
9540
+ drizzle: "Drizzle",
9541
+ typeorm: "TypeORM",
9542
+ mongoose: "Mongoose",
9543
+ sequelize: "Sequelize",
9544
+ knex: "Knex",
9545
+ "mikro-orm": "MikroORM",
9546
+ "ef-core": "EF Core",
9547
+ gorm: "GORM",
9548
+ sqlx: "sqlx",
9549
+ diesel: "Diesel",
9550
+ "sea-orm": "SeaORM",
9551
+ ecto: "Ecto",
9552
+ activerecord: "ActiveRecord",
9553
+ sequel: "Sequel",
9554
+ dapper: "Dapper",
9555
+ sqlalchemy: "SQLAlchemy",
9556
+ "tortoise-orm": "Tortoise ORM",
9557
+ "rom-rb": "ROM-rb",
9558
+ postgresql: "PostgreSQL",
9559
+ mysql: "MySQL",
9560
+ sqlite: "SQLite",
9561
+ mongodb: "MongoDB",
9562
+ redis: "Redis",
9563
+ elasticsearch: "Elasticsearch",
9564
+ turso: "Turso",
9565
+ neon: "Neon",
9566
+ dynamodb: "DynamoDB",
9567
+ csvhelper: "CsvHelper",
9568
+ epplus: "EPPlus",
9569
+ closedxml: "ClosedXML",
9570
+ // Auth
9571
+ "next-auth": "NextAuth",
9572
+ "auth-js": "Auth.js",
9573
+ lucia: "Lucia",
9574
+ passport: "Passport",
9575
+ jwt: "JWT",
9576
+ bcrypt: "bcrypt",
9577
+ clerk: "Clerk",
9578
+ devise: "Devise",
9579
+ doorkeeper: "Doorkeeper",
9580
+ guardian: "Guardian",
9581
+ pow: "Pow",
9582
+ identityserver: "IdentityServer",
9583
+ azure: "Azure AD",
9584
+ oauth2: "OAuth2",
9585
+ "google-sign-in": "Google Sign-In",
9586
+ "microsoft-identity": "Microsoft Identity",
9587
+ auth: "Auth",
9588
+ // Testing
9589
+ jest: "Jest",
9590
+ vitest: "Vitest",
9591
+ mocha: "Mocha",
9592
+ jasmine: "Jasmine",
9593
+ playwright: "Playwright",
9594
+ cypress: "Cypress",
9595
+ puppeteer: "Puppeteer",
9596
+ rspec: "RSpec",
9597
+ minitest: "Minitest",
9598
+ xunit: "xUnit",
9599
+ nunit: "NUnit",
9600
+ mstest: "MSTest",
9601
+ pytest: "pytest",
9602
+ testify: "Testify",
9603
+ ginkgo: "Ginkgo",
9604
+ exunit: "ExUnit",
9605
+ "ex-machina": "ex_machina",
9606
+ "unit-testing": "Unit Testing",
9607
+ "e2e-testing": "E2E Testing",
9608
+ "bdd-testing": "BDD Testing",
9609
+ moq: "Moq",
9610
+ nsubstitute: "NSubstitute",
9611
+ fakeiteasy: "FakeItEasy",
9612
+ mockito: "Mockito",
9613
+ mocking: "Mocking",
9614
+ mocktail: "Mocktail",
9615
+ mockall: "Mockall",
9616
+ "fluent-assertions": "FluentAssertions",
9617
+ shouldly: "Shouldly",
9618
+ assertj: "AssertJ",
9619
+ capybara: "Capybara",
9620
+ "factory-bot": "FactoryBot",
9621
+ "dotnet-test": ".NET Test",
9622
+ benchmark: "Benchmark",
9623
+ // AI / ML
9624
+ openai: "OpenAI",
9625
+ anthropic: "Anthropic",
9626
+ langchain: "LangChain",
9627
+ huggingface: "Hugging Face",
9628
+ pytorch: "PyTorch",
9629
+ tensorflow: "TensorFlow",
9630
+ keras: "Keras",
9631
+ jax: "JAX",
9632
+ "scikit-learn": "scikit-learn",
9633
+ numpy: "NumPy",
9634
+ pandas: "pandas",
9635
+ spacy: "spaCy",
9636
+ nltk: "NLTK",
9637
+ "vercel-ai": "Vercel AI",
9638
+ "llama-index": "LlamaIndex",
9639
+ chromadb: "ChromaDB",
9640
+ pinecone: "Pinecone",
9641
+ weaviate: "Weaviate",
9642
+ qdrant: "Qdrant",
9643
+ milvus: "Milvus",
9644
+ faiss: "FAISS",
9645
+ gemini: "Gemini",
9646
+ mistral: "Mistral",
9647
+ groq: "Groq",
9648
+ // Build
9649
+ vite: "Vite",
9650
+ webpack: "Webpack",
9651
+ esbuild: "esbuild",
9652
+ rollup: "Rollup",
9653
+ parcel: "Parcel",
9654
+ swc: "SWC",
9655
+ babel: "Babel",
9656
+ turborepo: "Turborepo",
9657
+ nx: "Nx",
9658
+ lerna: "Lerna",
9659
+ gradle: "Gradle",
9660
+ maven: "Maven",
9661
+ sbt: "sbt",
9662
+ cargo: "Cargo",
9663
+ spm: "SPM",
9664
+ cocoapods: "CocoaPods",
9665
+ carthage: "Carthage",
9666
+ pip: "pip",
9667
+ pipenv: "Pipenv",
9668
+ bundler: "Bundler",
9669
+ composer: "Composer",
9670
+ nuget: "NuGet",
9671
+ // CI/CD
9672
+ "github-actions": "GitHub Actions",
9673
+ "gitlab-ci": "GitLab CI",
9674
+ "travis-ci": "Travis CI",
9675
+ jenkins: "Jenkins",
9676
+ circleci: "CircleCI",
9677
+ "azure-devops": "Azure DevOps",
9678
+ bitbucket: "Bitbucket",
9679
+ "ci-cd": "CI/CD",
9680
+ // Infra
9681
+ docker: "Docker",
9682
+ "docker-compose": "Docker Compose",
9683
+ kubernetes: "Kubernetes",
9684
+ helm: "Helm",
9685
+ terraform: "Terraform",
9686
+ ansible: "Ansible",
9687
+ pulumi: "Pulumi",
9688
+ "aws-cdk": "AWS CDK",
9689
+ vagrant: "Vagrant",
9690
+ "infrastructure-as-code": "IaC",
9691
+ // Hosting
9692
+ vercel: "Vercel",
9693
+ netlify: "Netlify",
9694
+ "fly-io": "Fly.io",
9695
+ render: "Render",
9696
+ heroku: "Heroku",
9697
+ "gcp-app-engine": "GCP App Engine",
9698
+ "aws-lambda": "AWS Lambda",
9699
+ serverless: "Serverless",
9700
+ // Messaging
9701
+ rabbitmq: "RabbitMQ",
9702
+ kafka: "Kafka",
9703
+ nats: "NATS",
9704
+ masstransit: "MassTransit",
9705
+ oban: "Oban",
9706
+ broadway: "Broadway",
9707
+ sidekiq: "Sidekiq",
9708
+ celery: "Celery",
9709
+ hangfire: "Hangfire",
9710
+ "task-queue": "Task Queue",
9711
+ messaging: "Messaging",
9712
+ // Observability
9713
+ opentelemetry: "OpenTelemetry",
9714
+ prometheus: "Prometheus",
9715
+ sentry: "Sentry",
9716
+ datadog: "Datadog",
9717
+ logging: "Logging",
9718
+ serilog: "Serilog",
9719
+ nlog: "NLog",
9720
+ logrus: "Logrus",
9721
+ zap: "Zap",
9722
+ pino: "Pino",
9723
+ winston: "Winston",
9724
+ loguru: "Loguru"
9725
+ };
9726
+ var CAP_CATEGORIES = [
9727
+ ["Sprache", ["javascript", "typescript", "python", "rust", "golang", "java", "kotlin", "scala", "ruby", "php", "csharp", "fsharp", "vbnet", "swift", "dart", "elixir", "crystal", "zig", "nim", "perl", "cpp", "cmake"]],
9728
+ ["Runtime", ["nodejs", "dotnet", "jvm", "flutter"]],
9729
+ ["Framework", ["react", "nextjs", "vue", "nuxt", "svelte", "sveltekit", "angular", "remix", "astro", "gatsby", "qwik", "solidjs", "express", "fastify", "nestjs", "hono", "koa", "hapi", "feathers", "fastapi", "django", "flask", "starlette", "tornado", "litestar", "rails", "sinatra", "grape", "hanami", "spring-boot", "spring-web", "quarkus", "micronaut", "ktor", "phoenix", "axum", "actix-web", "warp", "rocket", "poem", "gin", "echo", "fiber", "chi", "gorilla-mux", "wpf", "avalonia", "maui", "blazor", "uno-platform", "liveview", "mvvm", "carter", "fastendpoints"]],
9730
+ ["ORM / DB", ["prisma", "drizzle", "typeorm", "mongoose", "sequelize", "knex", "mikro-orm", "ef-core", "gorm", "sqlx", "diesel", "sea-orm", "ecto", "activerecord", "sequel", "dapper", "sqlalchemy", "tortoise-orm", "rom-rb", "postgresql", "mysql", "sqlite", "mongodb", "redis", "elasticsearch", "turso", "neon", "dynamodb", "csvhelper", "epplus", "closedxml"]],
9731
+ ["Auth", ["next-auth", "auth-js", "lucia", "passport", "jwt", "bcrypt", "clerk", "devise", "doorkeeper", "guardian", "pow", "identityserver", "azure", "oauth2", "google-sign-in", "microsoft-identity", "auth"]],
9732
+ ["Testing", ["jest", "vitest", "mocha", "jasmine", "playwright", "cypress", "puppeteer", "rspec", "minitest", "xunit", "nunit", "mstest", "pytest", "testify", "ginkgo", "exunit", "ex-machina", "unit-testing", "e2e-testing", "bdd-testing", "moq", "nsubstitute", "fakeiteasy", "mockito", "mocking", "mocktail", "mockall", "fluent-assertions", "shouldly", "assertj", "capybara", "factory-bot", "dotnet-test", "benchmark"]],
9733
+ ["AI / ML", ["openai", "anthropic", "langchain", "huggingface", "pytorch", "tensorflow", "keras", "jax", "scikit-learn", "numpy", "pandas", "spacy", "nltk", "vercel-ai", "llama-index", "chromadb", "pinecone", "weaviate", "qdrant", "milvus", "faiss", "gemini", "mistral", "groq"]],
9734
+ ["Build", ["vite", "webpack", "esbuild", "rollup", "parcel", "swc", "babel", "turborepo", "nx", "lerna", "gradle", "maven", "sbt", "cargo", "spm", "cocoapods", "carthage", "pip", "pipenv", "bundler", "composer", "nuget"]],
9735
+ ["CI/CD", ["github-actions", "gitlab-ci", "travis-ci", "jenkins", "circleci", "azure-devops", "bitbucket", "ci-cd"]],
9736
+ ["Infra", ["docker", "docker-compose", "kubernetes", "helm", "terraform", "ansible", "pulumi", "aws-cdk", "vagrant", "infrastructure-as-code"]],
9737
+ ["Hosting", ["vercel", "netlify", "fly-io", "render", "heroku", "gcp-app-engine", "aws-lambda", "serverless"]],
9738
+ ["Messaging", ["rabbitmq", "kafka", "nats", "masstransit", "oban", "broadway", "sidekiq", "celery", "hangfire", "task-queue", "messaging"]],
9739
+ ["Observ.", ["opentelemetry", "prometheus", "sentry", "datadog", "logging", "serilog", "nlog", "logrus", "zap", "pino", "winston", "loguru"]]
9740
+ ];
9453
9741
  function buildCapabilitySummary(ids) {
9454
- if (ids.length === 0) return " Erkannt: (keine Capabilities)";
9455
- const lines = [];
9456
- for (let i = 0; i < ids.length && lines.length < 4; i += 4) {
9457
- lines.push(" \u2022 " + ids.slice(i, i + 4).join(" \xB7 "));
9458
- }
9459
- return " Erkannt:\n" + lines.join("\n");
9742
+ if (ids.length === 0) return " (keine Capabilities erkannt)";
9743
+ const set2 = new Set(ids);
9744
+ const rows = [];
9745
+ const used = /* @__PURE__ */ new Set();
9746
+ for (const [label, members] of CAP_CATEGORIES) {
9747
+ const matched = members.filter((m) => set2.has(m));
9748
+ if (matched.length === 0) continue;
9749
+ matched.forEach((m) => used.add(m));
9750
+ rows.push([label, matched]);
9751
+ }
9752
+ const rest2 = ids.filter((id) => !used.has(id));
9753
+ if (rest2.length > 0) rows.push(["Weitere", rest2]);
9754
+ if (rows.length === 0) return " (keine Capabilities erkannt)";
9755
+ const labelWidth = Math.max(...rows.map((r) => r[0].length));
9756
+ const sep = `${ANSI.dim} \xB7 ${ANSI.reset}`;
9757
+ return rows.map(([label, capIds]) => {
9758
+ const names = capIds.map((id) => CAP_DISPLAY[id] ?? id).join(sep);
9759
+ return ` ${ANSI.bold}${label.padEnd(labelWidth)}${ANSI.reset} ${names}`;
9760
+ }).join("\n");
9460
9761
  }
9461
9762
  if (command === "init") {
9462
9763
  (async () => {
@@ -9477,14 +9778,13 @@ if (command === "init") {
9477
9778
  console.log(` Nutze 'fh scan --update' um nur den Scan zu aktualisieren.`);
9478
9779
  process.exit(0);
9479
9780
  }
9480
- console.log("\u{1F50D} Analysiere Projekt...\n");
9781
+ process.stdout.write("\u{1F50D} Analysiere Projekt...");
9481
9782
  const scanResult = scan(projectRoot);
9482
- const tierCount = [1, 2, 3].map((t) => scanResult.signals.filter((s) => s.tier === t).length);
9483
- console.log(` \u2713 ${tierCount[0]} Technologie-Signale erkannt`);
9484
- console.log(` \u2713 ${tierCount[1]} Infrastruktur-Signale erkannt`);
9485
- console.log(` \u2713 ${tierCount[2]} Kontext-Signale erkannt`);
9486
- console.log();
9487
9783
  const capMap = mapSignalsToCapabilities(scanResult);
9784
+ const totalSignals = scanResult.signals.length;
9785
+ const totalCaps = capMap.confirmed.length;
9786
+ console.log(` ${totalSignals} Signale \xB7 ${totalCaps} Capabilities
9787
+ `);
9488
9788
  const block = loadClaudeMdBlock();
9489
9789
  writeForgehiveDir(projectRoot, scanResult, capMap, block);
9490
9790
  const hash = computeHash(projectRoot);
@@ -9495,19 +9795,18 @@ if (command === "init") {
9495
9795
  "forgehive"
9496
9796
  );
9497
9797
  initForgehiveRuntime(forgehiveDir, runtimeDir);
9498
- console.log("\u2713 forgehive initialisiert\n");
9499
9798
  console.log(buildCapabilitySummary(capMap.confirmed.map((c) => c.id)));
9500
9799
  console.log();
9501
9800
  if (subcommand === "--yes" || rest.includes("--yes")) {
9502
9801
  confirm(projectRoot);
9503
- console.log("\u2713 Capabilities best\xE4tigt\n");
9802
+ console.log("\u2713 forgehive bereit\n");
9504
9803
  } else {
9505
- const ok = await promptConfirm(" Capabilities best\xE4tigen? [Y/n] ");
9804
+ const ok = await promptConfirm(" Best\xE4tigen und loslegen? [Y/n] ");
9506
9805
  if (ok) {
9507
9806
  confirm(projectRoot);
9508
- console.log("\u2713 Capabilities best\xE4tigt\n");
9807
+ console.log("\n\u2713 forgehive bereit \u2014 \xF6ffne Claude Code in diesem Projekt.\n");
9509
9808
  } else {
9510
- console.log(" \xDCberpr\xFCfe .forgehive/capabilities.yaml, dann: fh confirm\n");
9809
+ console.log("\n \xDCberpr\xFCfe .forgehive/capabilities.yaml, dann: fh confirm\n");
9511
9810
  }
9512
9811
  }
9513
9812
  })().catch((err) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forgehive",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Context-aware AI development environment — one binary, your stack.",
5
5
  "type": "module",
6
6
  "bin": {