forgehive 1.0.3 → 1.0.4

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 +41 -17
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -9450,13 +9450,39 @@ async function promptConfirm(question) {
9450
9450
  });
9451
9451
  });
9452
9452
  }
9453
+ var CAP_CATEGORIES = [
9454
+ ["Sprache", ["javascript", "typescript", "python", "rust", "golang", "java", "kotlin", "scala", "ruby", "php", "csharp", "fsharp", "vbnet", "swift", "dart", "elixir", "crystal", "zig", "nim", "perl", "cpp", "cmake"]],
9455
+ ["Runtime", ["nodejs", "dotnet", "jvm", "flutter"]],
9456
+ ["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"]],
9457
+ ["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"]],
9458
+ ["Auth", ["next-auth", "auth-js", "lucia", "passport", "jwt", "bcrypt", "clerk", "devise", "doorkeeper", "guardian", "pow", "identityserver", "azure", "oauth2", "google-sign-in", "microsoft-identity", "auth"]],
9459
+ ["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"]],
9460
+ ["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"]],
9461
+ ["Build", ["vite", "webpack", "esbuild", "rollup", "parcel", "swc", "babel", "turborepo", "nx", "lerna", "gradle", "maven", "sbt", "cargo", "spm", "cocoapods", "carthage", "pip", "pipenv", "bundler", "composer", "nuget"]],
9462
+ ["CI/CD", ["github-actions", "gitlab-ci", "travis-ci", "jenkins", "circleci", "azure-devops", "bitbucket", "ci-cd"]],
9463
+ ["Infra", ["docker", "docker-compose", "kubernetes", "helm", "terraform", "ansible", "pulumi", "aws-cdk", "vagrant", "infrastructure-as-code"]],
9464
+ ["Hosting", ["vercel", "netlify", "fly-io", "render", "heroku", "gcp-app-engine", "aws-lambda", "serverless"]],
9465
+ ["Messaging", ["rabbitmq", "kafka", "nats", "masstransit", "oban", "broadway", "sidekiq", "celery", "hangfire", "task-queue", "messaging"]],
9466
+ ["Observ.", ["opentelemetry", "prometheus", "sentry", "datadog", "logging", "serilog", "nlog", "logrus", "zap", "pino", "winston", "loguru"]]
9467
+ ];
9453
9468
  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");
9469
+ if (ids.length === 0) return " (keine Capabilities erkannt)";
9470
+ const set2 = new Set(ids);
9471
+ const rows = [];
9472
+ const used = /* @__PURE__ */ new Set();
9473
+ for (const [label, members] of CAP_CATEGORIES) {
9474
+ const matched = members.filter((m) => set2.has(m));
9475
+ if (matched.length === 0) continue;
9476
+ matched.forEach((m) => used.add(m));
9477
+ rows.push([label, matched.join(" \xB7 ")]);
9478
+ }
9479
+ const rest2 = ids.filter((id) => !used.has(id));
9480
+ if (rest2.length > 0) rows.push(["Weitere", rest2.join(" \xB7 ")]);
9481
+ if (rows.length === 0) return " (keine Capabilities erkannt)";
9482
+ const labelWidth = Math.max(...rows.map((r) => r[0].length));
9483
+ return rows.map(
9484
+ ([label, val]) => ` ${label.padEnd(labelWidth)} ${val}`
9485
+ ).join("\n");
9460
9486
  }
9461
9487
  if (command === "init") {
9462
9488
  (async () => {
@@ -9477,14 +9503,13 @@ if (command === "init") {
9477
9503
  console.log(` Nutze 'fh scan --update' um nur den Scan zu aktualisieren.`);
9478
9504
  process.exit(0);
9479
9505
  }
9480
- console.log("\u{1F50D} Analysiere Projekt...\n");
9506
+ process.stdout.write("\u{1F50D} Analysiere Projekt...");
9481
9507
  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
9508
  const capMap = mapSignalsToCapabilities(scanResult);
9509
+ const totalSignals = scanResult.signals.length;
9510
+ const totalCaps = capMap.confirmed.length;
9511
+ console.log(` ${totalSignals} Signale \xB7 ${totalCaps} Capabilities
9512
+ `);
9488
9513
  const block = loadClaudeMdBlock();
9489
9514
  writeForgehiveDir(projectRoot, scanResult, capMap, block);
9490
9515
  const hash = computeHash(projectRoot);
@@ -9495,19 +9520,18 @@ if (command === "init") {
9495
9520
  "forgehive"
9496
9521
  );
9497
9522
  initForgehiveRuntime(forgehiveDir, runtimeDir);
9498
- console.log("\u2713 forgehive initialisiert\n");
9499
9523
  console.log(buildCapabilitySummary(capMap.confirmed.map((c) => c.id)));
9500
9524
  console.log();
9501
9525
  if (subcommand === "--yes" || rest.includes("--yes")) {
9502
9526
  confirm(projectRoot);
9503
- console.log("\u2713 Capabilities best\xE4tigt\n");
9527
+ console.log("\u2713 forgehive bereit\n");
9504
9528
  } else {
9505
- const ok = await promptConfirm(" Capabilities best\xE4tigen? [Y/n] ");
9529
+ const ok = await promptConfirm(" Best\xE4tigen und loslegen? [Y/n] ");
9506
9530
  if (ok) {
9507
9531
  confirm(projectRoot);
9508
- console.log("\u2713 Capabilities best\xE4tigt\n");
9532
+ console.log("\n\u2713 forgehive bereit \u2014 \xF6ffne Claude Code in diesem Projekt.\n");
9509
9533
  } else {
9510
- console.log(" \xDCberpr\xFCfe .forgehive/capabilities.yaml, dann: fh confirm\n");
9534
+ console.log("\n \xDCberpr\xFCfe .forgehive/capabilities.yaml, dann: fh confirm\n");
9511
9535
  }
9512
9536
  }
9513
9537
  })().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.4",
4
4
  "description": "Context-aware AI development environment — one binary, your stack.",
5
5
  "type": "module",
6
6
  "bin": {