specweave 0.1.8 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +600 -0
- package/README.md +263 -88
- package/bin/install-all.sh +1 -1
- package/bin/install-commands.sh +3 -3
- package/bin/specweave.js +39 -9
- package/dist/adapters/adapter-base.d.ts +1 -1
- package/dist/adapters/adapter-base.d.ts.map +1 -1
- package/dist/adapters/adapter-base.js +6 -41
- package/dist/adapters/adapter-base.js.map +1 -1
- package/dist/adapters/adapter-interface.js +1 -2
- package/dist/adapters/adapter-interface.js.map +1 -1
- package/dist/adapters/adapter-loader.d.ts +86 -0
- package/dist/adapters/adapter-loader.d.ts.map +1 -0
- package/dist/adapters/adapter-loader.js +216 -0
- package/dist/adapters/adapter-loader.js.map +1 -0
- package/dist/adapters/agents-md-generator.d.ts +48 -0
- package/dist/adapters/agents-md-generator.d.ts.map +1 -0
- package/dist/adapters/agents-md-generator.js +132 -0
- package/dist/adapters/agents-md-generator.js.map +1 -0
- package/dist/adapters/claude/adapter.d.ts +2 -2
- package/dist/adapters/claude/adapter.d.ts.map +1 -1
- package/dist/adapters/claude/adapter.js +5 -42
- package/dist/adapters/claude/adapter.js.map +1 -1
- package/dist/adapters/claude-md-generator.d.ts +78 -0
- package/dist/adapters/claude-md-generator.d.ts.map +1 -0
- package/dist/adapters/claude-md-generator.js +246 -0
- package/dist/adapters/claude-md-generator.js.map +1 -0
- package/dist/adapters/codex/adapter.d.ts +50 -0
- package/dist/adapters/codex/adapter.d.ts.map +1 -0
- package/dist/adapters/codex/adapter.js +316 -0
- package/dist/adapters/codex/adapter.js.map +1 -0
- package/dist/adapters/copilot/adapter.d.ts +10 -9
- package/dist/adapters/copilot/adapter.d.ts.map +1 -1
- package/dist/adapters/copilot/adapter.js +35 -100
- package/dist/adapters/copilot/adapter.js.map +1 -1
- package/dist/adapters/cursor/adapter.d.ts +8 -6
- package/dist/adapters/cursor/adapter.d.ts.map +1 -1
- package/dist/adapters/cursor/adapter.js +47 -130
- package/dist/adapters/cursor/adapter.js.map +1 -1
- package/dist/adapters/doc-generator.d.ts +69 -0
- package/dist/adapters/doc-generator.d.ts.map +1 -0
- package/dist/adapters/doc-generator.js +247 -0
- package/dist/adapters/doc-generator.js.map +1 -0
- package/dist/adapters/gemini/adapter.d.ts +50 -0
- package/dist/adapters/gemini/adapter.d.ts.map +1 -0
- package/dist/adapters/gemini/adapter.js +281 -0
- package/dist/adapters/gemini/adapter.js.map +1 -0
- package/dist/adapters/generic/adapter.d.ts +7 -4
- package/dist/adapters/generic/adapter.d.ts.map +1 -1
- package/dist/adapters/generic/adapter.js +60 -59
- package/dist/adapters/generic/adapter.js.map +1 -1
- package/dist/cli/commands/init.d.ts +3 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +272 -170
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +22 -58
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/list.d.ts.map +1 -1
- package/dist/cli/commands/list.js +27 -64
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/core/credentials-manager.d.ts +90 -0
- package/dist/core/credentials-manager.d.ts.map +1 -0
- package/dist/core/credentials-manager.js +271 -0
- package/dist/core/credentials-manager.js.map +1 -0
- package/dist/core/project-structure-detector.d.ts +92 -0
- package/dist/core/project-structure-detector.d.ts.map +1 -0
- package/dist/core/project-structure-detector.js +289 -0
- package/dist/core/project-structure-detector.js.map +1 -0
- package/dist/core/rfc-generator-v2.d.ts +149 -0
- package/dist/core/rfc-generator-v2.d.ts.map +1 -0
- package/dist/core/rfc-generator-v2.js +399 -0
- package/dist/core/rfc-generator-v2.js.map +1 -0
- package/dist/core/rfc-generator.d.ts +147 -0
- package/dist/core/rfc-generator.d.ts.map +1 -0
- package/dist/core/rfc-generator.js +434 -0
- package/dist/core/rfc-generator.js.map +1 -0
- package/dist/integrations/ado/ado-client.d.ts +123 -0
- package/dist/integrations/ado/ado-client.d.ts.map +1 -0
- package/dist/integrations/ado/ado-client.js +398 -0
- package/dist/integrations/ado/ado-client.js.map +1 -0
- package/dist/integrations/jira/jira-client.d.ts +139 -0
- package/dist/integrations/jira/jira-client.d.ts.map +1 -0
- package/dist/integrations/jira/jira-client.js +386 -0
- package/dist/integrations/jira/jira-client.js.map +1 -0
- package/dist/integrations/jira/jira-incremental-mapper.d.ts +75 -0
- package/dist/integrations/jira/jira-incremental-mapper.d.ts.map +1 -0
- package/dist/integrations/jira/jira-incremental-mapper.js +474 -0
- package/dist/integrations/jira/jira-incremental-mapper.js.map +1 -0
- package/dist/integrations/jira/jira-mapper.d.ts +105 -0
- package/dist/integrations/jira/jira-mapper.d.ts.map +1 -0
- package/dist/integrations/jira/jira-mapper.js +494 -0
- package/dist/integrations/jira/jira-mapper.js.map +1 -0
- package/dist/testing/test-generator.d.ts +117 -0
- package/dist/testing/test-generator.d.ts.map +1 -0
- package/dist/testing/test-generator.js +370 -0
- package/dist/testing/test-generator.js.map +1 -0
- package/dist/utils/auto-install.d.ts +3 -0
- package/dist/utils/auto-install.d.ts.map +1 -1
- package/dist/utils/auto-install.js +16 -82
- package/dist/utils/auto-install.js.map +1 -1
- package/dist/utils/esm-helpers.d.ts +50 -0
- package/dist/utils/esm-helpers.d.ts.map +1 -0
- package/dist/utils/esm-helpers.js +57 -0
- package/dist/utils/esm-helpers.js.map +1 -0
- package/package.json +16 -7
- package/src/adapters/README.md +1 -2
- package/src/adapters/adapter-base.ts +6 -3
- package/src/adapters/adapter-loader.ts +261 -0
- package/src/adapters/agents-md-generator.ts +162 -0
- package/src/adapters/claude/README.md +6 -14
- package/src/adapters/claude/adapter.ts +4 -4
- package/src/adapters/claude-md-generator.ts +311 -0
- package/src/adapters/codex/README.md +105 -0
- package/src/adapters/codex/adapter.ts +333 -0
- package/src/adapters/copilot/adapter.ts +36 -65
- package/src/adapters/cursor/README.md +0 -2
- package/src/adapters/cursor/adapter.ts +46 -92
- package/src/adapters/doc-generator.ts +331 -0
- package/src/adapters/gemini/README.md +97 -0
- package/src/adapters/gemini/adapter.ts +298 -0
- package/src/adapters/generic/adapter.ts +61 -57
- package/src/adapters/registry.yaml +86 -25
- package/src/agents/devops/AGENT.md +16 -18
- package/src/agents/docs-writer/AGENT.md +2 -2
- package/src/agents/pm/AGENT.md +1 -50
- package/src/commands/README.md +134 -111
- package/src/commands/{build.md → specweave.do.md} +185 -72
- package/src/commands/{done.md → specweave.done.md} +3 -3
- package/src/commands/{inc.md → specweave.inc.md} +4 -4
- package/src/commands/specweave.increment.md +383 -0
- package/src/commands/specweave.md +430 -0
- package/src/commands/specweave.next.md +495 -0
- package/src/commands/specweave.progress.md +258 -0
- package/src/commands/specweave.sync-docs.md +665 -0
- package/src/commands/specweave.sync-github.md +269 -0
- package/src/commands/specweave.sync-jira.md +197 -0
- package/src/commands/{validate.md → specweave.validate.md} +4 -4
- package/src/hooks/README.md +19 -29
- package/src/hooks/post-task-completion.sh +25 -30
- package/src/skills/ado-sync/README.md +1 -36
- package/src/skills/bmad-method-expert/SKILL.md +1 -3
- package/src/skills/brownfield-analyzer/SKILL.md +429 -23
- package/src/skills/brownfield-onboarder/SKILL.md +221 -8
- package/src/skills/context-loader/SKILL.md +239 -617
- package/src/skills/context-optimizer/SKILL.md +0 -30
- package/src/skills/github-sync/SKILL.md +1 -19
- package/src/skills/increment-planner/SKILL.md +64 -18
- package/src/skills/increment-quality-judge/SKILL.md +1 -36
- package/src/skills/jira-sync/README.md +1 -38
- package/src/skills/role-orchestrator/README.md +1 -22
- package/src/skills/role-orchestrator/SKILL.md +1 -59
- package/src/skills/skill-router/SKILL.md +0 -18
- package/src/skills/spec-kit-expert/SKILL.md +1 -3
- package/src/skills/specweave-detector/SKILL.md +225 -275
- package/src/skills/task-builder/README.md +1 -7
- package/src/templates/AGENTS.md.template +334 -0
- package/src/templates/CLAUDE.md.template +131 -297
- package/src/templates/README.md.template +115 -23
- package/src/templates/environments/minimal/README.md +0 -1
- package/INSTALL.md +0 -848
- package/SPECWEAVE.md +0 -711
- package/src/adapters/copilot/.github/copilot/instructions.md +0 -376
- package/src/adapters/cursor/.cursorrules +0 -325
- package/src/adapters/generic/SPECWEAVE-MANUAL.md +0 -676
- package/src/commands/create-project.md +0 -528
- package/src/commands/generate-docs.md +0 -623
- package/src/commands/increment.md +0 -223
- package/src/commands/review-docs.md +0 -331
- package/src/commands/sync-github.md +0 -115
- package/src/skills/ado-sync/test-cases/test-1.yaml +0 -9
- package/src/skills/ado-sync/test-cases/test-2.yaml +0 -8
- package/src/skills/ado-sync/test-cases/test-3.yaml +0 -9
- package/src/skills/bmad-method-expert/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/bmad-method-expert/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/bmad-method-expert/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/brownfield-analyzer/test-cases/test-1-basic-analysis.yaml +0 -48
- package/src/skills/brownfield-analyzer/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/brownfield-analyzer/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/brownfield-onboarder/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/brownfield-onboarder/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/brownfield-onboarder/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/calendar-system/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/calendar-system/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/calendar-system/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/context-loader/test-cases/test-1-basic-loading.yaml +0 -39
- package/src/skills/context-loader/test-cases/test-2-token-budget-exceeded.yaml +0 -44
- package/src/skills/context-loader/test-cases/test-3-section-anchors.yaml +0 -45
- package/src/skills/context-optimizer/test-cases/test-1-bug-fix-narrow.yaml +0 -97
- package/src/skills/context-optimizer/test-cases/test-2-feature-focused.yaml +0 -109
- package/src/skills/context-optimizer/test-cases/test-3-architecture-broad.yaml +0 -98
- package/src/skills/cost-optimizer/test-cases/test-1-basic-comparison.yaml +0 -75
- package/src/skills/cost-optimizer/test-cases/test-2-budget-constraint.yaml +0 -52
- package/src/skills/cost-optimizer/test-cases/test-3-scale-requirement.yaml +0 -63
- package/src/skills/cost-optimizer/test-results/README.md +0 -46
- package/src/skills/design-system-architect/test-cases/test-1-token-structure.yaml +0 -23
- package/src/skills/design-system-architect/test-cases/test-2-component-hierarchy.yaml +0 -24
- package/src/skills/design-system-architect/test-cases/test-3-accessibility-checklist.yaml +0 -23
- package/src/skills/diagrams-architect/test-cases/test-1-c4-context.yaml +0 -13
- package/src/skills/diagrams-architect/test-cases/test-2-sequence-diagram.yaml +0 -13
- package/src/skills/diagrams-architect/test-cases/test-3-er-diagram.yaml +0 -13
- package/src/skills/diagrams-generator/test-cases/test-1.yaml +0 -9
- package/src/skills/diagrams-generator/test-cases/test-2.yaml +0 -9
- package/src/skills/diagrams-generator/test-cases/test-3.yaml +0 -8
- package/src/skills/docs-updater/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/docs-updater/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/docs-updater/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/dotnet-backend/test-cases/test-1-rest-api.yaml +0 -14
- package/src/skills/dotnet-backend/test-cases/test-2-authentication.yaml +0 -13
- package/src/skills/dotnet-backend/test-cases/test-3-minimal-api.yaml +0 -13
- package/src/skills/e2e-playwright/test-cases/TC-001-basic-navigation.yaml +0 -54
- package/src/skills/e2e-playwright/test-cases/TC-002-form-interaction.yaml +0 -64
- package/src/skills/e2e-playwright/test-cases/TC-003-specweave-integration.yaml +0 -74
- package/src/skills/e2e-playwright/test-cases/TC-004-accessibility-check.yaml +0 -98
- package/src/skills/figma-designer/test-cases/test-1-design-system.yaml +0 -13
- package/src/skills/figma-designer/test-cases/test-2-component-library.yaml +0 -13
- package/src/skills/figma-designer/test-cases/test-3-responsive-layout.yaml +0 -13
- package/src/skills/figma-implementer/test-cases/test-1-design-to-react.yaml +0 -13
- package/src/skills/figma-implementer/test-cases/test-2-storybook.yaml +0 -13
- package/src/skills/figma-implementer/test-cases/test-3-design-tokens.yaml +0 -13
- package/src/skills/figma-mcp-connector/test-cases/test-1-read-file-desktop.yaml +0 -22
- package/src/skills/figma-mcp-connector/test-cases/test-2-read-file-framelink.yaml +0 -21
- package/src/skills/figma-mcp-connector/test-cases/test-3-error-handling.yaml +0 -18
- package/src/skills/figma-to-code/test-cases/test-1-token-generation.yaml +0 -29
- package/src/skills/figma-to-code/test-cases/test-2-component-generation.yaml +0 -27
- package/src/skills/figma-to-code/test-cases/test-3-typescript-generation.yaml +0 -28
- package/src/skills/frontend/test-cases/test-1-react-component.yaml +0 -13
- package/src/skills/frontend/test-cases/test-2-form-validation.yaml +0 -13
- package/src/skills/frontend/test-cases/test-3-state-management.yaml +0 -13
- package/src/skills/github-sync/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/github-sync/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/github-sync/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/hetzner-provisioner/test-cases/test-1-basic-provision.yaml +0 -71
- package/src/skills/hetzner-provisioner/test-cases/test-2-postgres-provision.yaml +0 -85
- package/src/skills/hetzner-provisioner/test-cases/test-3-ssl-config.yaml +0 -126
- package/src/skills/hetzner-provisioner/test-results/README.md +0 -259
- package/src/skills/increment-planner/test-cases/test-1-basic-feature.yaml +0 -27
- package/src/skills/increment-planner/test-cases/test-2-complex-feature.yaml +0 -30
- package/src/skills/increment-planner/test-cases/test-3-auto-numbering.yaml +0 -24
- package/src/skills/increment-quality-judge/test-cases/test-1-good-spec.yaml +0 -95
- package/src/skills/increment-quality-judge/test-cases/test-2-poor-spec.yaml +0 -108
- package/src/skills/increment-quality-judge/test-cases/test-3-export-suggestions.yaml +0 -87
- package/src/skills/jira-sync/test-cases/test-1.yaml +0 -9
- package/src/skills/jira-sync/test-cases/test-2.yaml +0 -9
- package/src/skills/jira-sync/test-cases/test-3.yaml +0 -10
- package/src/skills/nextjs/test-cases/test-1-app-router.yaml +0 -13
- package/src/skills/nextjs/test-cases/test-2-server-actions.yaml +0 -13
- package/src/skills/nextjs/test-cases/test-3-api-routes.yaml +0 -13
- package/src/skills/nodejs-backend/test-cases/test-1-express-api.yaml +0 -13
- package/src/skills/nodejs-backend/test-cases/test-2-prisma-orm.yaml +0 -13
- package/src/skills/nodejs-backend/test-cases/test-3-authentication.yaml +0 -13
- package/src/skills/notification-system/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/notification-system/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/notification-system/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/python-backend/test-cases/test-1-fastapi-crud.yaml +0 -13
- package/src/skills/python-backend/test-cases/test-2-sqlalchemy.yaml +0 -13
- package/src/skills/python-backend/test-cases/test-3-authentication.yaml +0 -13
- package/src/skills/role-orchestrator/test-cases/test-1-simple-product.yaml +0 -98
- package/src/skills/role-orchestrator/test-cases/test-2-quality-gate-failure.yaml +0 -73
- package/src/skills/role-orchestrator/test-cases/test-3-security-workflow.yaml +0 -121
- package/src/skills/role-orchestrator/test-cases/test-4-parallel-execution.yaml +0 -145
- package/src/skills/role-orchestrator/test-cases/test-5-feedback-loops.yaml +0 -149
- package/src/skills/skill-creator/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/skill-creator/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/skill-creator/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/skill-router/test-cases/test-1-basic-routing.yaml +0 -33
- package/src/skills/skill-router/test-cases/test-2-ambiguous-request.yaml +0 -42
- package/src/skills/skill-router/test-cases/test-3-nested-orchestration.yaml +0 -50
- package/src/skills/spec-driven-brainstorming/test-cases/TC-001-simple-idea-to-design.yaml +0 -148
- package/src/skills/spec-driven-brainstorming/test-cases/TC-002-complex-ultrathink-design.yaml +0 -190
- package/src/skills/spec-driven-brainstorming/test-cases/TC-003-unclear-requirements-socratic.yaml +0 -233
- package/src/skills/spec-driven-debugging/test-cases/TC-001-simple-auth-bug.yaml +0 -212
- package/src/skills/spec-driven-debugging/test-cases/TC-002-race-condition-ultrathink.yaml +0 -461
- package/src/skills/spec-driven-debugging/test-cases/TC-003-brownfield-missing-spec.yaml +0 -366
- package/src/skills/spec-kit-expert/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/spec-kit-expert/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/spec-kit-expert/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/specweave-ado-mapper/test-cases/test-1-export-to-ado.yaml +0 -13
- package/src/skills/specweave-ado-mapper/test-cases/test-2-import-from-ado.yaml +0 -13
- package/src/skills/specweave-ado-mapper/test-cases/test-3-bidirectional-sync.yaml +0 -13
- package/src/skills/specweave-detector/test-cases/test-1-basic-detection.yaml +0 -37
- package/src/skills/specweave-detector/test-cases/test-2-missing-config.yaml +0 -37
- package/src/skills/specweave-detector/test-cases/test-3-non-specweave-project.yaml +0 -34
- package/src/skills/specweave-jira-mapper/test-cases/test-1-export-to-jira.yaml +0 -13
- package/src/skills/specweave-jira-mapper/test-cases/test-2-import-from-jira.yaml +0 -13
- package/src/skills/specweave-jira-mapper/test-cases/test-3-sync-status.yaml +0 -13
- package/src/skills/stripe-integrator/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/stripe-integrator/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/stripe-integrator/test-cases/test-3-placeholder.yaml +0 -12
- package/src/skills/task-builder/test-cases/test-1-placeholder.yaml +0 -12
- package/src/skills/task-builder/test-cases/test-2-placeholder.yaml +0 -12
- package/src/skills/task-builder/test-cases/test-3-placeholder.yaml +0 -12
- package/src/templates/config.yaml +0 -351
- /package/src/commands/{list-increments.md → specweave.list-increments.md} +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESM Helpers
|
|
3
|
+
*
|
|
4
|
+
* Provides __dirname and __filename equivalents for ES modules.
|
|
5
|
+
* In ESM, these CommonJS globals are not available, so we need to derive them
|
|
6
|
+
* from import.meta.url.
|
|
7
|
+
*/
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { dirname } from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Get __dirname equivalent in ESM
|
|
12
|
+
*
|
|
13
|
+
* @param importMetaUrl - Pass import.meta.url from the calling module
|
|
14
|
+
* @returns The directory path of the calling module
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { getDirname } from './utils/esm-helpers.js';
|
|
19
|
+
* const __dirname = getDirname(import.meta.url);
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function getDirname(importMetaUrl) {
|
|
23
|
+
return dirname(fileURLToPath(importMetaUrl));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get __filename equivalent in ESM
|
|
27
|
+
*
|
|
28
|
+
* @param importMetaUrl - Pass import.meta.url from the calling module
|
|
29
|
+
* @returns The file path of the calling module
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* import { getFilename } from './utils/esm-helpers.js';
|
|
34
|
+
* const __filename = getFilename(import.meta.url);
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function getFilename(importMetaUrl) {
|
|
38
|
+
return fileURLToPath(importMetaUrl);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get both __dirname and __filename at once
|
|
42
|
+
*
|
|
43
|
+
* @param importMetaUrl - Pass import.meta.url from the calling module
|
|
44
|
+
* @returns Object with __dirname and __filename
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* import { getFilePaths } from './utils/esm-helpers.js';
|
|
49
|
+
* const { __dirname, __filename } = getFilePaths(import.meta.url);
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export function getFilePaths(importMetaUrl) {
|
|
53
|
+
const __filename = fileURLToPath(importMetaUrl);
|
|
54
|
+
const __dirname = dirname(__filename);
|
|
55
|
+
return { __dirname, __filename };
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=esm-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"esm-helpers.js","sourceRoot":"","sources":["../../src/utils/esm-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CAAC,aAAqB;IAC9C,OAAO,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,aAAqB;IAC/C,OAAO,aAAa,CAAC,aAAa,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,aAAqB;IAIhD,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACnC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Replace vibe coding with spec-driven development.
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Replace vibe coding with spec-driven development. Smart workflow: /specweave inc auto-closes previous, /specweave build auto-resumes, /specweave progress shows status. PM-led planning, 10 agents, 35+ skills. spec-weave.com",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"main": "dist/index.js",
|
|
6
7
|
"bin": {
|
|
7
8
|
"specweave": "./bin/specweave.js"
|
|
@@ -13,7 +14,15 @@
|
|
|
13
14
|
"test": "jest",
|
|
14
15
|
"test:smoke": "bash tests/smoke/e2e-smoke-test.sh",
|
|
15
16
|
"test:e2e": "playwright test tests/e2e/specweave-smoke.spec.ts",
|
|
16
|
-
"test:
|
|
17
|
+
"test:integration": "npm run test:integration:ado && npm run test:integration:jira",
|
|
18
|
+
"test:integration:ado": "ts-node tests/integration/ado-sync/ado-sync.test.ts",
|
|
19
|
+
"test:integration:jira": "ts-node tests/integration/jira-sync/jira-sync.test.ts",
|
|
20
|
+
"test:sync:jira": "ts-node tests/integration/jira-sync/jira-bidirectional-sync.test.ts",
|
|
21
|
+
"test:incremental:jira": "ts-node tests/integration/jira-sync/jira-incremental-sync.test.ts",
|
|
22
|
+
"generate:tests": "ts-node scripts/generate-tests.ts",
|
|
23
|
+
"generate:tests:skill": "ts-node scripts/generate-tests.ts",
|
|
24
|
+
"test:all:generated": "bash scripts/run-all-tests.sh",
|
|
25
|
+
"test:all": "npm test && npm run test:smoke && npm run test:integration",
|
|
17
26
|
"prepublishOnly": "npm run build",
|
|
18
27
|
"install:agents": "bash bin/install-agents.sh",
|
|
19
28
|
"install:skills": "bash bin/install-skills.sh",
|
|
@@ -22,10 +31,8 @@
|
|
|
22
31
|
"install:skills:global": "bash bin/install-skills.sh --global",
|
|
23
32
|
"install:all:global": "bash bin/install-all.sh --global",
|
|
24
33
|
"generate:diagrams": "bash scripts/generate-diagram-svgs.sh",
|
|
25
|
-
"docs:
|
|
26
|
-
"docs:
|
|
27
|
-
"docs:build:public": "cd docs-site && npm run build",
|
|
28
|
-
"docs:build:internal": "mkdocs build -f mkdocs-internal.yml"
|
|
34
|
+
"docs:dev": "cd docs-site && npm start",
|
|
35
|
+
"docs:build": "cd docs-site && npm run build"
|
|
29
36
|
},
|
|
30
37
|
"keywords": [
|
|
31
38
|
"specweave",
|
|
@@ -73,6 +80,7 @@
|
|
|
73
80
|
"commander": "^11.1.0",
|
|
74
81
|
"fs-extra": "^11.2.0",
|
|
75
82
|
"inquirer": "^9.2.12",
|
|
83
|
+
"js-yaml": "^4.1.0",
|
|
76
84
|
"ora": "^7.0.1",
|
|
77
85
|
"yaml": "^2.3.4"
|
|
78
86
|
},
|
|
@@ -82,6 +90,7 @@
|
|
|
82
90
|
"@types/fs-extra": "^11.0.4",
|
|
83
91
|
"@types/inquirer": "^9.0.7",
|
|
84
92
|
"@types/jest": "^29.5.11",
|
|
93
|
+
"@types/js-yaml": "^4.0.9",
|
|
85
94
|
"@types/node": "^20.10.0",
|
|
86
95
|
"jest": "^29.7.0",
|
|
87
96
|
"ts-jest": "^29.1.1",
|
package/src/adapters/README.md
CHANGED
|
@@ -12,7 +12,6 @@ SpecWeave adapters enable the framework to work with **ANY AI coding tool**, not
|
|
|
12
12
|
SpecWeave
|
|
13
13
|
├── Core (Tool-Agnostic)
|
|
14
14
|
│ └── .specweave/ # Plain Markdown + YAML
|
|
15
|
-
│ ├── config.yaml
|
|
16
15
|
│ ├── increments/
|
|
17
16
|
│ └── docs/
|
|
18
17
|
│
|
|
@@ -69,7 +68,7 @@ interface IAdapter {
|
|
|
69
68
|
**Files Installed**:
|
|
70
69
|
- `.claude/skills/` - Auto-activating skills (specweave-detector, skill-router, etc.)
|
|
71
70
|
- `.claude/agents/` - Specialized agents (PM, Architect, DevOps, QA, Security)
|
|
72
|
-
- `.claude/commands/` - Slash commands (/create-increment, /
|
|
71
|
+
- `.claude/commands/` - Slash commands (/create-increment, /sync-docs, etc.)
|
|
73
72
|
- `.claude/hooks/` - Auto-update hooks (post-task-completion, etc.)
|
|
74
73
|
|
|
75
74
|
**Features**:
|
|
@@ -5,15 +5,19 @@
|
|
|
5
5
|
* Concrete adapters extend this class and implement tool-specific logic.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
9
|
import * as path from 'path';
|
|
10
|
+
import { execSync } from 'child_process';
|
|
10
11
|
import {
|
|
11
12
|
IAdapter,
|
|
12
13
|
AdapterOptions,
|
|
13
14
|
RequirementsResult,
|
|
14
15
|
AdapterFile,
|
|
15
16
|
AutomationLevel
|
|
16
|
-
} from './adapter-interface';
|
|
17
|
+
} from './adapter-interface.js';
|
|
18
|
+
import { getDirname } from '../utils/esm-helpers.js';
|
|
19
|
+
|
|
20
|
+
const __dirname = getDirname(import.meta.url);
|
|
17
21
|
|
|
18
22
|
export abstract class AdapterBase implements IAdapter {
|
|
19
23
|
abstract name: string;
|
|
@@ -49,7 +53,6 @@ export abstract class AdapterBase implements IAdapter {
|
|
|
49
53
|
|
|
50
54
|
// Check Git
|
|
51
55
|
try {
|
|
52
|
-
const { execSync } = require('child_process');
|
|
53
56
|
execSync('git --version', { stdio: 'ignore' });
|
|
54
57
|
} catch (error) {
|
|
55
58
|
result.warnings.push('Git not found - version control features may not work');
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads adapters from registry, detects tools, and provides API for init command.
|
|
5
|
+
* Enables SpecWeave to work with ANY AI coding tool.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import * as YAML from 'yaml';
|
|
11
|
+
import { execSync } from 'child_process';
|
|
12
|
+
import { IAdapter } from './adapter-interface.js';
|
|
13
|
+
import { CursorAdapter } from './cursor/adapter.js';
|
|
14
|
+
import { CopilotAdapter } from './copilot/adapter.js';
|
|
15
|
+
import { GeminiAdapter } from './gemini/adapter.js';
|
|
16
|
+
import { CodexAdapter } from './codex/adapter.js';
|
|
17
|
+
import { GenericAdapter } from './generic/adapter.js';
|
|
18
|
+
import { getDirname } from '../utils/esm-helpers.js';
|
|
19
|
+
|
|
20
|
+
const __dirname = getDirname(import.meta.url);
|
|
21
|
+
|
|
22
|
+
export interface AdapterRegistry {
|
|
23
|
+
version: number;
|
|
24
|
+
last_updated: string;
|
|
25
|
+
adapters: Array<{
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
automation_level: string;
|
|
29
|
+
status: string;
|
|
30
|
+
directory: string;
|
|
31
|
+
market_share: string;
|
|
32
|
+
priority: string;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Adapter Loader - Main API for working with adapters
|
|
38
|
+
*/
|
|
39
|
+
export class AdapterLoader {
|
|
40
|
+
private adapters: Map<string, IAdapter> = new Map();
|
|
41
|
+
private registry: AdapterRegistry | null = null;
|
|
42
|
+
|
|
43
|
+
constructor() {
|
|
44
|
+
this.initializeAdapters();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Initialize all adapters
|
|
49
|
+
*
|
|
50
|
+
* NOTE: Claude Code is NOT an adapter - it's the native/default experience!
|
|
51
|
+
* Adapters only exist for tools that need to APPROXIMATE Claude's native capabilities.
|
|
52
|
+
*/
|
|
53
|
+
private initializeAdapters(): void {
|
|
54
|
+
// Note: No ClaudeAdapter - Claude is the baseline, not an adaptation!
|
|
55
|
+
this.adapters.set('cursor', new CursorAdapter());
|
|
56
|
+
this.adapters.set('copilot', new CopilotAdapter());
|
|
57
|
+
this.adapters.set('gemini', new GeminiAdapter());
|
|
58
|
+
this.adapters.set('codex', new CodexAdapter());
|
|
59
|
+
this.adapters.set('generic', new GenericAdapter());
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Load registry.yaml
|
|
64
|
+
*/
|
|
65
|
+
async loadRegistry(): Promise<AdapterRegistry> {
|
|
66
|
+
if (this.registry) {
|
|
67
|
+
return this.registry;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Try dist first, then fall back to src (for development)
|
|
71
|
+
let registryPath = path.join(__dirname, 'registry.yaml');
|
|
72
|
+
if (!await fs.pathExists(registryPath)) {
|
|
73
|
+
registryPath = path.join(__dirname, '../../src/adapters/registry.yaml');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const content = await fs.readFile(registryPath, 'utf-8');
|
|
77
|
+
this.registry = YAML.parse(content) as AdapterRegistry;
|
|
78
|
+
|
|
79
|
+
return this.registry;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Get all available adapters
|
|
84
|
+
*/
|
|
85
|
+
getAllAdapters(): IAdapter[] {
|
|
86
|
+
return Array.from(this.adapters.values());
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Get adapter by name
|
|
91
|
+
*/
|
|
92
|
+
getAdapter(name: string): IAdapter | undefined {
|
|
93
|
+
return this.adapters.get(name);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Auto-detect which tool is being used
|
|
98
|
+
*
|
|
99
|
+
* Detection priority (based on market share and probability):
|
|
100
|
+
* 1. Claude Code (if .claude/ exists or claude CLI found) - NATIVE, no adapter needed
|
|
101
|
+
* 2. Cursor (if cursor CLI or .cursor/ or .cursorrules exists)
|
|
102
|
+
* 3. Gemini CLI (if gemini CLI found)
|
|
103
|
+
* 4. Codex (if codex CLI found)
|
|
104
|
+
* 5. Copilot (if .github/copilot/ exists)
|
|
105
|
+
* 6. Generic (fallback - always returns true)
|
|
106
|
+
*
|
|
107
|
+
* @returns Promise<string> Detected tool name (not adapter - Claude has no adapter!)
|
|
108
|
+
*/
|
|
109
|
+
async detectTool(): Promise<string> {
|
|
110
|
+
console.log('🔍 Detecting AI coding tool...\n');
|
|
111
|
+
|
|
112
|
+
// Check for Claude first (native, no adapter)
|
|
113
|
+
if (await this.commandExists('claude') || await this.fileExists('.claude')) {
|
|
114
|
+
console.log(`✅ Detected: Claude Code (native - full automation)`);
|
|
115
|
+
return 'claude';
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Check other tools (need adapters)
|
|
119
|
+
const detectionOrder = ['cursor', 'gemini', 'codex', 'copilot', 'generic'];
|
|
120
|
+
|
|
121
|
+
for (const adapterName of detectionOrder) {
|
|
122
|
+
const adapter = this.adapters.get(adapterName);
|
|
123
|
+
if (!adapter) continue;
|
|
124
|
+
|
|
125
|
+
const detected = await adapter.detect();
|
|
126
|
+
if (detected) {
|
|
127
|
+
console.log(`✅ Detected: ${adapter.name} (${adapter.automationLevel} automation)`);
|
|
128
|
+
return adapterName;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Fallback to generic (should never reach here since generic always returns true)
|
|
133
|
+
console.log('ℹ️ Using generic adapter (manual workflow)');
|
|
134
|
+
return 'generic';
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Helper: Check if a command exists in PATH
|
|
139
|
+
*/
|
|
140
|
+
private async commandExists(command: string): Promise<boolean> {
|
|
141
|
+
try {
|
|
142
|
+
execSync(`which ${command}`, { stdio: 'ignore' });
|
|
143
|
+
return true;
|
|
144
|
+
} catch (error) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Helper: Check if a file exists
|
|
151
|
+
*/
|
|
152
|
+
private async fileExists(filePath: string): Promise<boolean> {
|
|
153
|
+
try {
|
|
154
|
+
await fs.access(filePath);
|
|
155
|
+
return true;
|
|
156
|
+
} catch (error) {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Check requirements for a specific adapter
|
|
163
|
+
*/
|
|
164
|
+
async checkRequirements(adapterName: string): Promise<void> {
|
|
165
|
+
const adapter = this.adapters.get(adapterName);
|
|
166
|
+
if (!adapter) {
|
|
167
|
+
throw new Error(`Adapter not found: ${adapterName}`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const result = await adapter.checkRequirements();
|
|
171
|
+
|
|
172
|
+
if (!result.met) {
|
|
173
|
+
console.error('\n❌ Requirements not met:\n');
|
|
174
|
+
result.missing.forEach(req => console.error(` - ${req}`));
|
|
175
|
+
throw new Error('System requirements not met');
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (result.warnings.length > 0) {
|
|
179
|
+
console.warn('\n⚠️ Warnings:\n');
|
|
180
|
+
result.warnings.forEach(warning => console.warn(` - ${warning}`));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* List all available adapters with details
|
|
186
|
+
*/
|
|
187
|
+
async listAdapters(): Promise<void> {
|
|
188
|
+
const registry = await this.loadRegistry();
|
|
189
|
+
|
|
190
|
+
console.log('\n📋 SpecWeave Tool Support:\n');
|
|
191
|
+
console.log('━'.repeat(70));
|
|
192
|
+
console.log('');
|
|
193
|
+
|
|
194
|
+
// Show Claude first (baseline, not an adapter)
|
|
195
|
+
const claudeInfo = registry.adapters.find(a => a.name === 'claude');
|
|
196
|
+
if (claudeInfo) {
|
|
197
|
+
console.log(`🚀 CLAUDE CODE (Baseline - No Adapter Needed)`);
|
|
198
|
+
console.log(` ${claudeInfo.description}`);
|
|
199
|
+
console.log(` Native: skills, agents, hooks, slash commands | Market: ${claudeInfo.market_share}`);
|
|
200
|
+
console.log('');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
console.log('📦 Adapters (For Other Tools):\n');
|
|
204
|
+
|
|
205
|
+
// Show other adapters
|
|
206
|
+
for (const adapterInfo of registry.adapters) {
|
|
207
|
+
if (adapterInfo.name === 'claude') continue; // Skip Claude, already shown
|
|
208
|
+
|
|
209
|
+
const adapter = this.adapters.get(adapterInfo.name);
|
|
210
|
+
if (!adapter) continue;
|
|
211
|
+
|
|
212
|
+
console.log(`${this.getAutomationIcon(adapter.automationLevel)} ${adapter.name.toUpperCase()}`);
|
|
213
|
+
console.log(` ${adapter.description}`);
|
|
214
|
+
console.log(` Automation: ${adapter.automationLevel} | Market: ${adapterInfo.market_share}`);
|
|
215
|
+
console.log('');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
console.log('━'.repeat(70));
|
|
219
|
+
console.log('\nTotal Market Coverage: 100%');
|
|
220
|
+
console.log('SpecWeave works with ANY AI coding tool!');
|
|
221
|
+
console.log('\n💡 Claude Code = Native experience (no adapter)');
|
|
222
|
+
console.log(' Other tools = Adapters approximate Claude\'s capabilities\n');
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Get icon for automation level
|
|
227
|
+
*/
|
|
228
|
+
private getAutomationIcon(level: string): string {
|
|
229
|
+
switch (level) {
|
|
230
|
+
case 'full': return '🚀';
|
|
231
|
+
case 'semi': return '⚡';
|
|
232
|
+
case 'basic': return '📝';
|
|
233
|
+
case 'manual': return '📖';
|
|
234
|
+
default: return '❓';
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Get recommended adapter based on detection and user preference
|
|
240
|
+
*/
|
|
241
|
+
async getRecommendedAdapter(explicitChoice?: string): Promise<IAdapter> {
|
|
242
|
+
// If user explicitly chose an adapter, use it
|
|
243
|
+
if (explicitChoice) {
|
|
244
|
+
const adapter = this.adapters.get(explicitChoice);
|
|
245
|
+
if (!adapter) {
|
|
246
|
+
throw new Error(`Invalid adapter: ${explicitChoice}. Use 'claude', 'cursor', 'copilot', or 'generic'`);
|
|
247
|
+
}
|
|
248
|
+
return adapter;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Otherwise, auto-detect
|
|
252
|
+
const detectedName = await this.detectTool();
|
|
253
|
+
const adapter = this.adapters.get(detectedName);
|
|
254
|
+
|
|
255
|
+
if (!adapter) {
|
|
256
|
+
throw new Error(`Detected adapter not found: ${detectedName}`);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
return adapter;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AGENTS.md Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates a universal AGENTS.md file for ALL AI coding tools EXCEPT Claude Code.
|
|
5
|
+
* Follows the agents.md standard: https://agents.md/
|
|
6
|
+
*
|
|
7
|
+
* IMPORTANT:
|
|
8
|
+
* - Claude Code does NOT read this file - it only reads CLAUDE.md
|
|
9
|
+
* - This file is for: Cursor, Gemini CLI, Codex, GitHub Copilot, and ANY other AI tool
|
|
10
|
+
*
|
|
11
|
+
* This ONE file replaces:
|
|
12
|
+
* - .cursorrules (Cursor)
|
|
13
|
+
* - .github/copilot/instructions.md (Copilot)
|
|
14
|
+
* - Any other tool-specific configuration files
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { DocGenerator } from './doc-generator.js';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
import fs from 'fs-extra';
|
|
20
|
+
import { getDirname } from '../utils/esm-helpers.js';
|
|
21
|
+
|
|
22
|
+
const __dirname = getDirname(import.meta.url);
|
|
23
|
+
|
|
24
|
+
export interface AgentsMdOptions {
|
|
25
|
+
projectName: string;
|
|
26
|
+
projectPath: string;
|
|
27
|
+
templatePath?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Generate universal AGENTS.md file
|
|
32
|
+
*/
|
|
33
|
+
export class AgentsMdGenerator {
|
|
34
|
+
private docGen: DocGenerator;
|
|
35
|
+
|
|
36
|
+
constructor(
|
|
37
|
+
skillsDir?: string,
|
|
38
|
+
agentsDir?: string,
|
|
39
|
+
commandsDir?: string
|
|
40
|
+
) {
|
|
41
|
+
this.docGen = new DocGenerator(skillsDir, agentsDir, commandsDir);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Generate complete AGENTS.md content
|
|
46
|
+
*/
|
|
47
|
+
async generate(options: AgentsMdOptions): Promise<string> {
|
|
48
|
+
// Read template
|
|
49
|
+
const templatePath = options.templatePath ||
|
|
50
|
+
path.join(__dirname, '../templates/AGENTS.md.template');
|
|
51
|
+
|
|
52
|
+
if (!await fs.pathExists(templatePath)) {
|
|
53
|
+
throw new Error(`AGENTS.md template not found at: ${templatePath}`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let content = await fs.readFile(templatePath, 'utf-8');
|
|
57
|
+
|
|
58
|
+
// Extract agents and skills
|
|
59
|
+
const skills = await this.docGen.extractSkills();
|
|
60
|
+
const agents = await this.docGen.extractAgents();
|
|
61
|
+
|
|
62
|
+
// Replace placeholders
|
|
63
|
+
content = content.replace(/\{PROJECT_NAME\}/g, options.projectName);
|
|
64
|
+
content = content.replace('{AGENTS_SECTION}', this.generateAgentsSection(agents));
|
|
65
|
+
content = content.replace('{SKILLS_SECTION}', this.generateSkillsSection(skills));
|
|
66
|
+
content = content.replace('{TIMESTAMP}', new Date().toISOString().split('T')[0]);
|
|
67
|
+
|
|
68
|
+
return content;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Generate agents section as simple Markdown
|
|
73
|
+
*/
|
|
74
|
+
private generateAgentsSection(agents: any[]): string {
|
|
75
|
+
let section = '';
|
|
76
|
+
|
|
77
|
+
for (const agent of agents) {
|
|
78
|
+
section += `### ${agent.role}\n`;
|
|
79
|
+
section += `**Purpose**: ${agent.description}\n`;
|
|
80
|
+
section += `**When to use**: ${this.getAgentActivation(agent.name)}\n`;
|
|
81
|
+
section += `**Location**: \`.claude/agents/${agent.name}/AGENT.md\`\n\n`;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return section;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get agent activation guidance
|
|
89
|
+
*/
|
|
90
|
+
private getAgentActivation(agentName: string): string {
|
|
91
|
+
const activations: Record<string, string> = {
|
|
92
|
+
'pm': 'Creating requirements, user stories, product specs (WHAT/WHY)',
|
|
93
|
+
'architect': 'System design, architecture decisions, technical plans (HOW)',
|
|
94
|
+
'devops': 'Infrastructure, deployment, CI/CD pipelines',
|
|
95
|
+
'qa-lead': 'Test strategy, test cases, quality assurance',
|
|
96
|
+
'security': 'Threat modeling, security review, vulnerability assessment',
|
|
97
|
+
'tech-lead': 'Code review, best practices, refactoring',
|
|
98
|
+
'frontend': 'UI components, React/Vue/Angular implementation',
|
|
99
|
+
'nodejs-backend': 'Node.js/Express/NestJS backend APIs',
|
|
100
|
+
'python-backend': 'FastAPI/Django backend APIs',
|
|
101
|
+
'nextjs': 'Next.js App Router applications',
|
|
102
|
+
'dotnet-backend': 'ASP.NET Core backend APIs',
|
|
103
|
+
'sre': 'Incident response, troubleshooting, runbooks',
|
|
104
|
+
'docs-writer': 'Technical documentation, API docs, guides',
|
|
105
|
+
'performance': 'Performance optimization, profiling, benchmarking'
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
return activations[agentName] || 'Specialized tasks requiring this expertise';
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Generate skills section as simple Markdown
|
|
113
|
+
*/
|
|
114
|
+
private generateSkillsSection(skills: any[]): string {
|
|
115
|
+
let section = '';
|
|
116
|
+
|
|
117
|
+
for (const skill of skills) {
|
|
118
|
+
section += `### ${skill.name}\n`;
|
|
119
|
+
section += `**Purpose**: ${skill.description}\n`;
|
|
120
|
+
section += `**When to use**: ${this.getSkillActivation(skill.name)}\n`;
|
|
121
|
+
section += `**Location**: \`.claude/skills/${skill.name}/SKILL.md\`\n\n`;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return section;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Get skill activation guidance
|
|
129
|
+
*/
|
|
130
|
+
private getSkillActivation(skillName: string): string {
|
|
131
|
+
const activations: Record<string, string> = {
|
|
132
|
+
'specweave-detector': 'User asks about SpecWeave commands or workflows',
|
|
133
|
+
'increment-planner': 'Creating new feature increments (/inc command)',
|
|
134
|
+
'context-loader': 'Working on increments, need to load relevant context',
|
|
135
|
+
'skill-router': 'Ambiguous requests that need routing to specific skills',
|
|
136
|
+
'spec-driven-debugging': 'Bug investigation, test failures, unexpected behavior',
|
|
137
|
+
'spec-driven-brainstorming': 'Brainstorming ideas, refining concepts, design thinking',
|
|
138
|
+
'brownfield-analyzer': 'Analyzing existing projects for SpecWeave migration',
|
|
139
|
+
'brownfield-onboarder': 'Onboarding existing projects to SpecWeave',
|
|
140
|
+
'nodejs-backend': 'Node.js/Express/NestJS backend development',
|
|
141
|
+
'python-backend': 'Python/FastAPI/Django backend development',
|
|
142
|
+
'nextjs': 'Next.js App Router application development',
|
|
143
|
+
'frontend': 'React/Vue/Angular frontend development',
|
|
144
|
+
'dotnet-backend': 'ASP.NET Core backend development',
|
|
145
|
+
'e2e-playwright': 'End-to-end testing with Playwright',
|
|
146
|
+
'jira-sync': 'JIRA integration and synchronization',
|
|
147
|
+
'github-sync': 'GitHub issues/milestones synchronization',
|
|
148
|
+
'ado-sync': 'Azure DevOps synchronization',
|
|
149
|
+
'hetzner-provisioner': 'Hetzner Cloud infrastructure provisioning',
|
|
150
|
+
'cost-optimizer': 'Cloud cost optimization and platform comparison',
|
|
151
|
+
'figma-mcp-connector': 'Figma design integration via MCP',
|
|
152
|
+
'design-system-architect': 'Design system and Atomic Design methodology',
|
|
153
|
+
'figma-designer': 'Figma design creation and design tokens',
|
|
154
|
+
'figma-implementer': 'Converting Figma designs to code',
|
|
155
|
+
'figma-to-code': 'Figma to React/Angular code generation',
|
|
156
|
+
'role-orchestrator': 'Multi-agent orchestration for complex tasks',
|
|
157
|
+
'increment-quality-judge': 'AI-powered quality assessment of specs and plans'
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
return activations[skillName] || 'Specialized tasks';
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -63,9 +63,9 @@ This adapter represents the **gold standard** - all other adapters attempt to ap
|
|
|
63
63
|
| Command | Purpose |
|
|
64
64
|
|---------|---------|
|
|
65
65
|
| `/create-increment` | Create new feature increment |
|
|
66
|
-
| `/
|
|
66
|
+
| `/sync-docs` | Review strategic documentation |
|
|
67
67
|
| `/sync-github` | Sync to GitHub issues |
|
|
68
|
-
|
|
|
68
|
+
| `specweave init` | Bootstrap new project |
|
|
69
69
|
|
|
70
70
|
**Plus more commands** (see `.claude/commands/`)
|
|
71
71
|
|
|
@@ -107,7 +107,7 @@ npm run install:agents
|
|
|
107
107
|
│ └── ...
|
|
108
108
|
├── commands/ # Slash commands
|
|
109
109
|
│ ├── create-increment.md
|
|
110
|
-
│ ├──
|
|
110
|
+
│ ├── sync-docs.md
|
|
111
111
|
│ └── ...
|
|
112
112
|
└── hooks/ # Auto-update mechanisms
|
|
113
113
|
├── post-task-completion.sh
|
|
@@ -135,10 +135,10 @@ npm run install:agents
|
|
|
135
135
|
|
|
136
136
|
### Example 2: Review Documentation
|
|
137
137
|
|
|
138
|
-
**User**: `/
|
|
138
|
+
**User**: `/sync-docs`
|
|
139
139
|
|
|
140
140
|
**What Happens** (Automatic):
|
|
141
|
-
1. ✅ Slash command loads `.claude/commands/
|
|
141
|
+
1. ✅ Slash command loads `.claude/commands/sync-docs.md`
|
|
142
142
|
2. ✅ Reviews strategic docs (.specweave/docs/internal/strategy/)
|
|
143
143
|
3. ✅ Compares against actual implementation
|
|
144
144
|
4. ✅ Identifies gaps (undocumented features, outdated docs, tech debt)
|
|
@@ -206,15 +206,7 @@ Agents have separate context windows to prevent pollution of main conversation.
|
|
|
206
206
|
|
|
207
207
|
Hooks run automatically on events:
|
|
208
208
|
|
|
209
|
-
|
|
210
|
-
# .specweave/config.yaml
|
|
211
|
-
hooks:
|
|
212
|
-
post_task_completion:
|
|
213
|
-
enabled: true
|
|
214
|
-
actions:
|
|
215
|
-
- update_documentation
|
|
216
|
-
- update_claude_md
|
|
217
|
-
```
|
|
209
|
+
|
|
218
210
|
|
|
219
211
|
When task completes → hook fires → docs auto-update.
|
|
220
212
|
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import * as path from 'path';
|
|
12
|
-
import
|
|
13
|
-
import { AdapterBase } from '../adapter-base';
|
|
14
|
-
import { AdapterOptions, AdapterFile } from '../adapter-interface';
|
|
12
|
+
import fs from 'fs-extra';
|
|
13
|
+
import { AdapterBase } from '../adapter-base.js';
|
|
14
|
+
import { AdapterOptions, AdapterFile } from '../adapter-interface.js';
|
|
15
15
|
|
|
16
16
|
export class ClaudeAdapter extends AdapterBase {
|
|
17
17
|
name = 'claude';
|
|
@@ -131,7 +131,7 @@ WHAT THIS PROVIDES:
|
|
|
131
131
|
|
|
132
132
|
- Skills (Auto-Activating): specweave-detector, skill-router, context-loader, increment-planner
|
|
133
133
|
- Agents (Specialized Roles): PM, Architect, DevOps, QA, Security, and 14 more
|
|
134
|
-
- Slash Commands: /
|
|
134
|
+
- Slash Commands: /specweave inc, /specweave do, /specweave validate, /specweave sync-github
|
|
135
135
|
- Hooks (Auto-Update): post-task-completion, pre-implementation, docs-changed
|
|
136
136
|
|
|
137
137
|
WHY CLAUDE CODE IS BEST:
|