@bluefly/openstandardagents 0.4.6 → 0.4.8
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/.version.json +3 -3
- package/CHANGELOG.md +16 -0
- package/README.md +1 -0
- package/dist/.version.json +3 -3
- package/dist/adapters/mcp/converter.js +4 -3
- package/dist/adapters/npm/adapter.js +2 -1
- package/dist/adapters/openai-agents/adapter.js +1 -1
- package/dist/cli/commands/config.command.d.ts +7 -0
- package/dist/cli/commands/config.command.js +92 -0
- package/dist/cli/commands/migrate.command.js +1 -1
- package/dist/cli/commands/sign.command.d.ts +3 -0
- package/dist/cli/commands/sign.command.js +42 -0
- package/dist/cli/commands/skills.command.js +4 -6
- package/dist/config/cli-config.d.ts +33 -0
- package/dist/config/cli-config.js +107 -0
- package/dist/mcp-server/index.js +0 -0
- package/dist/package.json +8 -9
- package/dist/services/governance/cedar-provider.js +2 -1
- package/dist/services/release-automation/base-crud.service.d.ts +93 -0
- package/dist/services/release-automation/base-crud.service.js +68 -0
- package/dist/services/release-automation/generate-changelog.d.ts +7 -0
- package/dist/services/release-automation/generate-changelog.js +288 -0
- package/dist/services/release-automation/increment-dev-tag.d.ts +7 -0
- package/dist/services/release-automation/increment-dev-tag.js +160 -0
- package/dist/services/release-automation/index.d.ts +12 -0
- package/dist/services/release-automation/index.js +12 -0
- package/dist/services/release-automation/merge-request.service.d.ts +119 -0
- package/dist/services/release-automation/merge-request.service.js +212 -0
- package/dist/services/release-automation/milestone.service.d.ts +104 -0
- package/dist/services/release-automation/milestone.service.js +207 -0
- package/dist/services/release-automation/release-agent.service.d.ts +39 -0
- package/dist/services/release-automation/release-agent.service.js +43 -0
- package/dist/services/release-automation/release-buttons.d.ts +7 -0
- package/dist/services/release-automation/release-buttons.js +207 -0
- package/dist/services/release-automation/release.service.d.ts +118 -0
- package/dist/services/release-automation/release.service.js +207 -0
- package/dist/services/release-automation/schemas/release.schema.d.ts +299 -0
- package/dist/services/release-automation/schemas/release.schema.js +272 -0
- package/dist/services/release-automation/tag.service.d.ts +99 -0
- package/dist/services/release-automation/tag.service.js +183 -0
- package/dist/services/release-automation/webhook.service.d.ts +37 -0
- package/dist/services/release-automation/webhook.service.js +187 -0
- package/dist/skills/test-skill/README.md +36 -0
- package/dist/skills/test-skill/SKILL.md +31 -0
- package/dist/skills/test-skill/index.d.ts +31 -0
- package/dist/skills/test-skill/install.js +44 -0
- package/dist/skills/test-skill/package.json +36 -0
- package/dist/spec/reference/reference-agents/compliance-auditor/manifest.ossa.yaml +1 -1
- package/dist/spec/reference/reference-agents/doc-agent/manifest.ossa.yaml +1 -1
- package/dist/spec/reference/reference-agents/mr-reviewer/manifest.ossa.yaml +1 -1
- package/dist/spec/reference/reference-agents/ossa-validator-v0.3/manifest.ossa.yaml +1 -1
- package/dist/spec/reference/reference-agents/pipeline-fixer/manifest.ossa.yaml +1 -1
- package/dist/spec/reference/reference-agents/release-orchestrator/manifest.ossa.yaml +1 -1
- package/dist/spec/uadp/README.md +393 -0
- package/dist/spec/uadp/openapi.yaml +387 -0
- package/dist/spec/uadp/schemas/uadp-agents-response.schema.json +68 -0
- package/dist/spec/uadp/schemas/uadp-federation-response.schema.json +46 -0
- package/dist/spec/uadp/schemas/uadp-manifest.schema.json +82 -0
- package/dist/spec/uadp/schemas/uadp-skills-response.schema.json +72 -0
- package/dist/spec/v0.4/agent-card.schema.json +1 -1
- package/dist/spec/v0.4/agent.schema.json +15 -15
- package/dist/spec/v0.4/extensions/a2a/a2a.schema.json +1 -1
- package/dist/spec/v0.4/extensions/ag2/ag2.schema.json +1 -1
- package/dist/spec/v0.4/extensions/crewai/crewai.schema.json +1 -1
- package/dist/spec/v0.4/extensions/kagent/kagent.schema.json +1 -1
- package/dist/spec/v0.4/extensions/langchain/langchain.schema.json +1 -1
- package/dist/spec/v0.4/extensions/langgraph/langgraph.schema.json +1 -1
- package/dist/spec/v0.4/extensions/mcp/mcp.schema.json +1 -1
- package/dist/spec/v0.5/agent-card.schema.json +477 -0
- package/dist/spec/v0.5/agent.schema.json +1556 -0
- package/dist/spec/v0.5/conformance/profiles/baseline.json +19 -0
- package/dist/spec/v0.5/conformance/profiles/enterprise.json +20 -0
- package/dist/spec/v0.5/extensions/a2a/README.md +193 -0
- package/dist/spec/v0.5/extensions/a2a/a2a.schema.json +77 -0
- package/dist/spec/v0.5/extensions/ag2/ag2.schema.json +277 -0
- package/dist/spec/v0.5/extensions/cognition/cognition.schema.json +94 -0
- package/dist/spec/v0.5/extensions/cognition/thought-node.schema.json +80 -0
- package/dist/spec/v0.5/extensions/crewai/crewai.schema.json +256 -0
- package/dist/spec/v0.5/extensions/drupal/drupal.schema.json +318 -0
- package/dist/spec/v0.5/extensions/evals/evals.schema.json +597 -0
- package/dist/spec/v0.5/extensions/governance/governance-extension.yaml +161 -0
- package/dist/spec/v0.5/extensions/identity/identity.schema.json +302 -0
- package/dist/spec/v0.5/extensions/kagent/README.md +315 -0
- package/dist/spec/v0.5/extensions/kagent/kagent.schema.json +624 -0
- package/dist/spec/v0.5/extensions/langchain/langchain.schema.json +243 -0
- package/dist/spec/v0.5/extensions/langgraph/langgraph.schema.json +211 -0
- package/dist/spec/v0.5/extensions/mcp/README.md +276 -0
- package/dist/spec/v0.5/extensions/mcp/mcp.schema.json +84 -0
- package/dist/spec/v0.5/extensions/memory/memory.schema.json +7 -0
- package/dist/spec/v0.5/extensions/team/team.schema.json +304 -0
- package/dist/spec/v0.5/extensions/token-efficiency/token-efficiency.schema.json +47 -0
- package/dist/spec/v0.5/mcp.schema.json +1 -0
- package/dist/spec/v0.5/skill.schema.json +1 -0
- package/dist/spec/v0.5/validator.schema.json +282 -0
- package/dist/validation/error-codes.js +1 -1
- package/examples/a2a/agent-handoff.ossa.yaml +1 -1
- package/examples/a2a/service-discovery.ossa.yaml +1 -1
- package/examples/adapters/drupal-eca-mapping.yaml +1 -1
- package/examples/adapters/drupal-eca-task.yaml +1 -1
- package/examples/adapters/drupal-flowdrop-mapping.yaml +1 -1
- package/examples/adapters/drupal-maestro-mapping.yaml +1 -1
- package/examples/adapters/mistral-agent.yaml +1 -1
- package/examples/adapters/symfony-messenger-task.yaml +1 -1
- package/examples/adapters/symfony-messenger-workflow.yaml +1 -1
- package/examples/adk-integration/code-review-workflow.yml +1 -1
- package/examples/adk-integration/customer-support.yml +1 -1
- package/examples/adk-integration/data-pipeline.yml +1 -1
- package/examples/advanced/reasoning-agent.yaml +1 -1
- package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
- package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
- package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
- package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
- package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
- package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
- package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
- package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
- package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
- package/examples/agent-taxonomy-example.ossa.yaml +1 -1
- package/examples/agents/01-customer-support-bot/agent.ossa.yaml +1 -1
- package/examples/agents/02-code-review-agent/agent.ossa.yaml +1 -1
- package/examples/agents/03-data-analysis-agent/agent.ossa.yaml +1 -1
- package/examples/agents/04-content-moderator/agent.ossa.yaml +1 -1
- package/examples/agents/05-sales-assistant/agent.ossa.yaml +1 -1
- package/examples/agents/06-devops-agent/agent.ossa.yaml +1 -1
- package/examples/agents/07-research-assistant/agent.ossa.yaml +1 -1
- package/examples/agents/08-email-triage-agent/agent.ossa.yaml +1 -1
- package/examples/agents/09-security-scanner/agent.ossa.yaml +1 -1
- package/examples/agents/10-meeting-assistant/agent.ossa.yaml +1 -1
- package/examples/agents/architecture-healer-enterprise.yaml +1 -1
- package/examples/agents/dependency-healer-npm.yaml +1 -1
- package/examples/agents/spec-healer-openapi.yaml +1 -1
- package/examples/agents/wiki-healer-production.yaml +1 -1
- package/examples/agents-md/monorepo-agent.ossa.yaml +1 -1
- package/examples/agentscope/react-assistant/README.md +111 -0
- package/examples/agentscope/react-assistant/agent.ossa.yaml +132 -0
- package/examples/agentscope/react-assistant/skills/code-analysis/SKILL.md +18 -0
- package/examples/agentscope/react-assistant/skills/question-answering/SKILL.md +18 -0
- package/examples/autonomous-evolution/self-evolving-agent.ossa.yaml +1 -1
- package/examples/bridges/.gitlab-ci.yml +2 -2
- package/examples/build-once-use-everywhere/agent.ossa.yaml +1 -1
- package/examples/claude-code/code-reviewer.ossa.yaml +1 -1
- package/examples/claude-code/ossa-validator.ossa.yaml +1 -1
- package/examples/common_npm/agent-router.ossa.yaml +1 -1
- package/examples/contracts/data-consumer.ossa.yaml +1 -1
- package/examples/contracts/data-producer-v2.ossa.yaml +1 -1
- package/examples/contracts/data-producer.ossa.yaml +1 -1
- package/examples/drupal/QUICKSTART.md +17 -3
- package/examples/drupal/ai_agents_agentscope/README.md +62 -0
- package/examples/drupal/ai_agents_agentscope/ai_agents_agentscope.info.yml +13 -0
- package/examples/drupal/ai_agents_agentscope/ai_agents_agentscope.services.yml +4 -0
- package/examples/drupal/ai_agents_agentscope/config/install/ai_agents_agentscope.settings.yml +3 -0
- package/examples/drupal/ai_agents_agentscope/config/schema/ai_agents_agentscope.schema.yml +14 -0
- package/examples/drupal/ai_agents_agentscope/src/AgentScopeRuntime.php +11 -0
- package/examples/drupal/ai_agents_agentscope/src/Plugin/AiAgent/AgentScopeAgent.php +10 -0
- package/examples/drupal/ai_agents_agentscope/src/Plugin/AiProvider/AgentScopeProvider.php +217 -0
- package/examples/drupal/ai_agents_agentscope/src/Plugin/Derivative/AgentScopeDeriver.php +10 -0
- package/examples/drupal/ai_agents_agentscope/src/Service/AgentScopeAdapter.php +9 -0
- package/examples/drupal/content-moderator.ossa.yaml +1 -1
- package/examples/drupal/gitlab-ml-recommender.ossa.yaml +1 -1
- package/examples/export/langchain/production-agent-with-memory/agent.ossa.yaml +1 -1
- package/examples/export/langchain/production-agent-with-tools/agent.ossa.yaml +1 -1
- package/examples/extensions/agents-md-advanced.yml +1 -1
- package/examples/extensions/agents-md-basic.yml +1 -1
- package/examples/extensions/agents-md-sync.yml +1 -1
- package/examples/extensions/agents-md-v1.yml +1 -1
- package/examples/extensions/drupal-v1.yml +1 -1
- package/examples/extensions/encryption-multi-provider.yaml +4 -4
- package/examples/extensions/kagent-v1.yml +1 -1
- package/examples/extensions/knowledge-sources.yaml +1 -1
- package/examples/extensions/mcp-full-featured.yaml +1 -1
- package/examples/getting-started/01-minimal-agent.ossa.yaml +1 -1
- package/examples/getting-started/02-agent-with-tools.ossa.yaml +1 -1
- package/examples/getting-started/03-agent-with-safety.ossa.yaml +1 -1
- package/examples/getting-started/04-agent-with-messaging.ossa.yaml +1 -1
- package/examples/getting-started/05-workflow-composition.ossa.yaml +1 -1
- package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
- package/examples/gitlab-agents/daily-code-scan/.gitlab-ci.yml +2 -2
- package/examples/gitlab-agents/duo-comment-responder/.gitlab-ci.yml +2 -2
- package/examples/gitlab-agents/mr-reviewer/.gitlab-ci.yml +2 -2
- package/examples/gitlab-agents/pipeline-auto-fix/.gitlab-ci.yml +2 -2
- package/examples/gitlab-agents/pre-commit-quality-check/.gitlab-ci.yml +2 -2
- package/examples/gitlab-agents/pre-push-validation/.gitlab-ci.yml +2 -2
- package/examples/hierarchical-agent.ossa.yaml +1 -1
- package/examples/infrastructure/token-rotation/manifest.ossa.yaml +1 -1
- package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +1 -1
- package/examples/kagent/compliance-validator.ossa.yaml +1 -1
- package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
- package/examples/kagent/documentation-agent.ossa.yaml +1 -1
- package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +1 -1
- package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
- package/examples/kagent/security-scanner.ossa.yaml +1 -1
- package/examples/knowledge-graph/drupal-agent-with-kg.ossa.yaml +1 -1
- package/examples/mcp/browser-puppeteer.ossa.yaml +1 -1
- package/examples/mcp/database-mcp.ossa.yaml +1 -1
- package/examples/mcp/filesystem-mcp.ossa.yaml +1 -1
- package/examples/messaging/dependency-healer.ossa.yaml +1 -1
- package/examples/messaging/incident-responder.ossa.yaml +1 -1
- package/examples/messaging/routing-rules.ossa.yaml +1 -1
- package/examples/messaging/security-scanner.ossa.yaml +1 -1
- package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
- package/examples/migrations/langchain/01-python-react-agent-after.ossa.yaml +1 -1
- package/examples/migrations/langchain/02-typescript-conversational-after.ossa.yaml +1 -1
- package/examples/migrations/langchain/03-sequential-chain-after.ossa.yaml +1 -1
- package/examples/migrations/langchain/04-config-based-after.ossa.yaml +1 -1
- package/examples/migrations/swarm-to-ossa/after-handoffs.ossa.yaml +6 -6
- package/examples/migrations/swarm-to-ossa/after-triage-agent.ossa.yaml +3 -3
- package/examples/mr-reviewer-with-governance.ossa.yaml +1 -1
- package/examples/multi-agent/conditional-router.ossa.yaml +1 -1
- package/examples/multi-agent/parallel-execution.ossa.yaml +1 -1
- package/examples/multi-agent/sequential-pipeline.ossa.yaml +1 -1
- package/examples/multi-agent-research-workflow.ossa.yaml +1 -1
- package/examples/multi-platform/single-manifest/agent.ossa.yaml +1 -1
- package/examples/observability/activity-stream-full.yaml +1 -1
- package/examples/openai/basic-agent.ossa.yaml +1 -1
- package/examples/ossa-templates/01-code-assistant.ossa.yaml +1 -1
- package/examples/ossa-templates/02-security-scanner.ossa.yaml +1 -1
- package/examples/ossa-templates/03-ci-pipeline.ossa.yaml +1 -1
- package/examples/ossa-templates/04-code-reviewer.ossa.yaml +1 -1
- package/examples/ossa-templates/05-doc-generator.ossa.yaml +1 -1
- package/examples/ossa-templates/06-compliance-validator.ossa.yaml +1 -1
- package/examples/ossa-templates/07-workflow-orchestrator.ossa.yaml +1 -1
- package/examples/ossa-templates/08-content-writer.ossa.yaml +1 -1
- package/examples/ossa-templates/09-test-generator.ossa.yaml +1 -1
- package/examples/ossa-templates/10-data-transformer.ossa.yaml +1 -1
- package/examples/ossa-templates/11-react-performance-expert.ossa.yaml +1 -1
- package/examples/ossa-templates/12-typescript-type-safety-expert.ossa.yaml +1 -1
- package/examples/ossa-templates/13-accessibility-champion.ossa.yaml +1 -1
- package/examples/ossa-templates/14-security-hardening-agent.ossa.yaml +1 -1
- package/examples/pipeline-agent.ossa.yaml +1 -1
- package/examples/production/document-analyzer-openai.yml +1 -1
- package/examples/production-ready/01-customer-support-bot/agent.ossa.yaml +1 -1
- package/examples/production-ready/02-code-review-agent/agent.ossa.yaml +1 -1
- package/examples/production-ready/03-data-analysis-agent/agent.ossa.yaml +1 -1
- package/examples/production-ready/04-content-moderator/agent.ossa.yaml +1 -1
- package/examples/production-ready/05-sales-assistant/agent.ossa.yaml +1 -1
- package/examples/production-ready/06-devops-agent/agent.ossa.yaml +1 -1
- package/examples/production-ready/07-research-assistant/agent.ossa.yaml +1 -1
- package/examples/production-ready/08-email-triage-agent/agent.ossa.yaml +1 -1
- package/examples/production-ready/09-security-scanner/agent.ossa.yaml +1 -1
- package/examples/production-ready/10-meeting-assistant/agent.ossa.yaml +1 -1
- package/examples/quickstart/support-agent.ossa.yaml +1 -1
- package/examples/real-world/gitlab-cicd-optimizer.ossa.yaml +1 -1
- package/examples/real-world/rag-documentation-assistant.ossa.yaml +1 -1
- package/examples/registry/agents/code-reviewer/agent.yaml +1 -1
- package/examples/registry/agents/security-scanner/agent.yaml +1 -1
- package/examples/runtime-adapters/bedrock-claude-example.ossa.yaml +1 -1
- package/examples/schema/reusable-components.yaml +1 -1
- package/examples/showcase/ci-pipeline.ossa.yaml +1 -1
- package/examples/showcase/code-assistant.ossa.yaml +1 -1
- package/examples/showcase/code-reviewer.ossa.yaml +1 -1
- package/examples/showcase/compliance-checker.ossa.yaml +1 -1
- package/examples/showcase/compliance-validator.ossa.yaml +1 -1
- package/examples/showcase/content-writer.ossa.yaml +1 -1
- package/examples/showcase/customer-support.ossa.yaml +1 -1
- package/examples/showcase/data-processing-pipeline.ossa.yaml +1 -1
- package/examples/showcase/data-transformer.ossa.yaml +1 -1
- package/examples/showcase/doc-generator.ossa.yaml +1 -1
- package/examples/showcase/full-power-agent.ossa.yaml +1 -1
- package/examples/showcase/security-scanner-enhanced.ossa.yaml +1 -1
- package/examples/showcase/security-scanner.ossa.yaml +1 -1
- package/examples/showcase/team-leader.ossa.yaml +1 -1
- package/examples/showcase/test-generator.ossa.yaml +1 -1
- package/examples/showcase/workflow-orchestrator.ossa.yaml +1 -1
- package/examples/skills-example.ossa.yaml +1 -1
- package/examples/swarm-agent.ossa.yaml +1 -1
- package/examples/tasks/batch-email-sender.yaml +1 -1
- package/examples/tasks/data-transform.yaml +1 -1
- package/examples/tasks/publish-content.yaml +1 -1
- package/examples/team-agent.ossa.yaml +1 -1
- package/examples/templates/ossa-compliance.yaml +1 -1
- package/examples/unified/security-scanner.ossa.yaml +1 -1
- package/examples/workflows/batch-email-campaign.yaml +1 -1
- package/examples/workflows/content-review-publish.yaml +1 -1
- package/examples/workflows/simple-etl.yaml +1 -1
- package/package.json +6 -7
- package/spec/reference/reference-agents/compliance-auditor/manifest.ossa.yaml +1 -1
- package/spec/reference/reference-agents/doc-agent/manifest.ossa.yaml +1 -1
- package/spec/reference/reference-agents/mr-reviewer/manifest.ossa.yaml +1 -1
- package/spec/reference/reference-agents/ossa-validator-v0.3/manifest.ossa.yaml +1 -1
- package/spec/reference/reference-agents/pipeline-fixer/manifest.ossa.yaml +1 -1
- package/spec/reference/reference-agents/release-orchestrator/manifest.ossa.yaml +1 -1
- package/spec/v0.4/agent-card.schema.json +1 -1
- package/spec/v0.4/agent.schema.json +84 -15
- package/spec/v0.4/extensions/a2a/a2a.schema.json +1 -1
- package/spec/v0.4/extensions/ag2/ag2.schema.json +1 -1
- package/spec/v0.4/extensions/crewai/crewai.schema.json +1 -1
- package/spec/v0.4/extensions/kagent/kagent.schema.json +1 -1
- package/spec/v0.4/extensions/langchain/langchain.schema.json +1 -1
- package/spec/v0.4/extensions/langgraph/langgraph.schema.json +1 -1
- package/spec/v0.4/extensions/mcp/mcp.schema.json +1 -1
- package/templates/agent-types/claude-agent.ossa.yaml +1 -1
- package/templates/agent-types/kagent.ossa.yaml +1 -1
- package/templates/agent-types/langchain-agent.ossa.yaml +1 -1
- package/templates/agent-types/openapi-agent.ossa.yaml +1 -1
- package/templates/agent-types/swarm-agents.ossa.yaml +1 -1
- package/templates/ci-cd/gitlab-ci.deploy.yml +2 -2
- package/templates/validators/capability-compatibility.ossa.yaml +1 -1
- package/templates/validators/coordination-consistency.ossa.yaml +1 -1
- package/templates/validators/pattern-requirements.ossa.yaml +1 -1
- package/templates/validators/transport-compatibility.ossa.yaml +1 -1
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tag CRUD Service
|
|
3
|
+
* Implements full CRUD operations for Git tags
|
|
4
|
+
*/
|
|
5
|
+
import { Gitlab } from '@gitbeaker/rest';
|
|
6
|
+
import { TagSchema, CreateTagRequestSchema, } from './schemas/release.schema.js';
|
|
7
|
+
import { BaseCrudService } from './base-crud.service.js';
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
/**
|
|
10
|
+
* Tag Filter Input
|
|
11
|
+
*/
|
|
12
|
+
const TagFilterSchema = z.object({
|
|
13
|
+
version: z.string().optional(),
|
|
14
|
+
type: z.enum(['dev', 'rc', 'release', 'all']).default('all'),
|
|
15
|
+
page: z.number().int().positive().default(1),
|
|
16
|
+
perPage: z.number().int().positive().min(1).max(100).default(20),
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Tag Service - CRUD operations
|
|
20
|
+
*/
|
|
21
|
+
export class TagService extends BaseCrudService {
|
|
22
|
+
createSchema = CreateTagRequestSchema;
|
|
23
|
+
updateSchema = z.never(); // Tags cannot be updated
|
|
24
|
+
filterSchema = TagFilterSchema;
|
|
25
|
+
entitySchema = TagSchema;
|
|
26
|
+
gitlab;
|
|
27
|
+
projectId;
|
|
28
|
+
constructor(gitlabToken, projectId = process.env.CI_PROJECT_ID || '') {
|
|
29
|
+
super();
|
|
30
|
+
this.gitlab = new Gitlab({ token: gitlabToken });
|
|
31
|
+
this.projectId = projectId;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create a new tag
|
|
35
|
+
*/
|
|
36
|
+
async create(input) {
|
|
37
|
+
try {
|
|
38
|
+
const validated = this.validateCreate(input);
|
|
39
|
+
// Check if tag already exists
|
|
40
|
+
const existing = await this.read(validated.name);
|
|
41
|
+
if (existing) {
|
|
42
|
+
throw new Error(`Tag ${validated.name} already exists`);
|
|
43
|
+
}
|
|
44
|
+
// Create tag via GitLab API
|
|
45
|
+
const tag = await this.gitlab.Tags.create(this.projectId, validated.name, validated.ref, {
|
|
46
|
+
message: validated.message || `Tag ${validated.name}`,
|
|
47
|
+
});
|
|
48
|
+
const result = {
|
|
49
|
+
name: tag.name,
|
|
50
|
+
type: this.determineTagType(tag.name),
|
|
51
|
+
version: this.extractVersion(tag.name),
|
|
52
|
+
commitSha: tag.commit?.id || '',
|
|
53
|
+
message: tag.message || '',
|
|
54
|
+
createdAt: new Date().toISOString(),
|
|
55
|
+
ref: validated.ref,
|
|
56
|
+
};
|
|
57
|
+
return this.validateEntity(result);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
this.handleValidationError(error);
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Read tag by name
|
|
66
|
+
*/
|
|
67
|
+
async read(id) {
|
|
68
|
+
this.validateId(id);
|
|
69
|
+
try {
|
|
70
|
+
const tagName = String(id);
|
|
71
|
+
const tags = await this.gitlab.Tags.all(this.projectId, {
|
|
72
|
+
search: tagName,
|
|
73
|
+
});
|
|
74
|
+
const tag = tags.find((t) => t.name === tagName);
|
|
75
|
+
if (!tag) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const result = {
|
|
79
|
+
name: tag.name,
|
|
80
|
+
type: this.determineTagType(tag.name),
|
|
81
|
+
version: this.extractVersion(tag.name),
|
|
82
|
+
commitSha: tag.commit?.id || '',
|
|
83
|
+
message: tag.message || '',
|
|
84
|
+
createdAt: tag.createdAt || new Date().toISOString(),
|
|
85
|
+
ref: tag.target || 'unknown',
|
|
86
|
+
};
|
|
87
|
+
return this.validateEntity(result);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Update tag - NOT SUPPORTED (tags are immutable)
|
|
95
|
+
*/
|
|
96
|
+
async update() {
|
|
97
|
+
throw new Error('Tags are immutable and cannot be updated');
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Delete tag
|
|
101
|
+
*/
|
|
102
|
+
async delete(id) {
|
|
103
|
+
this.validateId(id);
|
|
104
|
+
const existing = await this.read(id);
|
|
105
|
+
if (!existing) {
|
|
106
|
+
this.throwNotFound('Tag', id);
|
|
107
|
+
}
|
|
108
|
+
await this.gitlab.Tags.remove(this.projectId, String(id));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* List tags with filtering and pagination
|
|
112
|
+
*/
|
|
113
|
+
async list(filters) {
|
|
114
|
+
const validatedFilters = this.validateFilter(filters || {});
|
|
115
|
+
try {
|
|
116
|
+
const tags = await this.gitlab.Tags.all(this.projectId, {
|
|
117
|
+
perPage: 100,
|
|
118
|
+
search: validatedFilters.version,
|
|
119
|
+
});
|
|
120
|
+
const items = tags
|
|
121
|
+
.map((tag) => ({
|
|
122
|
+
name: tag.name,
|
|
123
|
+
type: this.determineTagType(tag.name),
|
|
124
|
+
version: this.extractVersion(tag.name),
|
|
125
|
+
commitSha: tag.commit?.id || '',
|
|
126
|
+
message: tag.message || '',
|
|
127
|
+
createdAt: tag.createdAt || new Date().toISOString(),
|
|
128
|
+
ref: tag.target || 'unknown',
|
|
129
|
+
}))
|
|
130
|
+
.filter((tag) => {
|
|
131
|
+
if (validatedFilters.type !== 'all') {
|
|
132
|
+
return tag.type === validatedFilters.type;
|
|
133
|
+
}
|
|
134
|
+
if (validatedFilters.version) {
|
|
135
|
+
return tag.version.includes(validatedFilters.version);
|
|
136
|
+
}
|
|
137
|
+
return true;
|
|
138
|
+
})
|
|
139
|
+
.map((tag) => this.validateEntity(tag));
|
|
140
|
+
// Sort by version (newest first)
|
|
141
|
+
items.sort((a, b) => {
|
|
142
|
+
return b.version.localeCompare(a.version, undefined, {
|
|
143
|
+
numeric: true,
|
|
144
|
+
sensitivity: 'base',
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
// Paginate
|
|
148
|
+
const total = items.length;
|
|
149
|
+
const page = validatedFilters.page;
|
|
150
|
+
const perPage = validatedFilters.perPage;
|
|
151
|
+
const start = (page - 1) * perPage;
|
|
152
|
+
const end = start + perPage;
|
|
153
|
+
const paginated = items.slice(start, end);
|
|
154
|
+
return {
|
|
155
|
+
items: paginated,
|
|
156
|
+
pagination: this.calculatePagination(total, page, perPage),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
throw new Error(`Failed to list tags: ${error}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Helper: Determine tag type from name
|
|
165
|
+
*/
|
|
166
|
+
determineTagType(tagName) {
|
|
167
|
+
if (tagName.includes('-dev.'))
|
|
168
|
+
return 'dev';
|
|
169
|
+
if (tagName.includes('-rc.'))
|
|
170
|
+
return 'rc';
|
|
171
|
+
return 'release';
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Helper: Extract version from tag name
|
|
175
|
+
*/
|
|
176
|
+
extractVersion(tagName) {
|
|
177
|
+
return tagName
|
|
178
|
+
.replace(/^v/, '')
|
|
179
|
+
.replace(/-dev\.[0-9]+$/, '')
|
|
180
|
+
.replace(/-rc\.[0-9]+$/, '');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=tag.service.js.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook Service
|
|
3
|
+
* Handles GitLab webhooks with Zod validation
|
|
4
|
+
*/
|
|
5
|
+
import { type WebhookResponse } from './schemas/release.schema.js';
|
|
6
|
+
/**
|
|
7
|
+
* Webhook Service
|
|
8
|
+
* DRY: Centralized webhook handling
|
|
9
|
+
*/
|
|
10
|
+
export declare class WebhookService {
|
|
11
|
+
private releaseService;
|
|
12
|
+
private milestoneService;
|
|
13
|
+
private tagService;
|
|
14
|
+
private mergeRequestService;
|
|
15
|
+
constructor(gitlabToken: string, projectId?: string | number);
|
|
16
|
+
/**
|
|
17
|
+
* Handle milestone webhook
|
|
18
|
+
*/
|
|
19
|
+
handleMilestoneWebhook(payload: unknown): Promise<WebhookResponse>;
|
|
20
|
+
/**
|
|
21
|
+
* Handle push webhook
|
|
22
|
+
*/
|
|
23
|
+
handlePushWebhook(payload: unknown): Promise<WebhookResponse>;
|
|
24
|
+
/**
|
|
25
|
+
* Handle milestone creation
|
|
26
|
+
*/
|
|
27
|
+
private handleMilestoneCreate;
|
|
28
|
+
/**
|
|
29
|
+
* Handle milestone closure
|
|
30
|
+
*/
|
|
31
|
+
private handleMilestoneClose;
|
|
32
|
+
/**
|
|
33
|
+
* Handle release branch push
|
|
34
|
+
*/
|
|
35
|
+
private handleReleaseBranchPush;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=webhook.service.d.ts.map
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook Service
|
|
3
|
+
* Handles GitLab webhooks with Zod validation
|
|
4
|
+
*/
|
|
5
|
+
import { MilestoneWebhookPayloadSchema, PushWebhookPayloadSchema, WebhookResponseSchema, } from './schemas/release.schema.js';
|
|
6
|
+
import { ReleaseService } from './release.service.js';
|
|
7
|
+
import { MilestoneService } from './milestone.service.js';
|
|
8
|
+
import { TagService } from './tag.service.js';
|
|
9
|
+
import { MergeRequestService } from './merge-request.service.js';
|
|
10
|
+
/**
|
|
11
|
+
* Webhook Service
|
|
12
|
+
* DRY: Centralized webhook handling
|
|
13
|
+
*/
|
|
14
|
+
export class WebhookService {
|
|
15
|
+
releaseService;
|
|
16
|
+
milestoneService;
|
|
17
|
+
tagService;
|
|
18
|
+
mergeRequestService;
|
|
19
|
+
constructor(gitlabToken, projectId = process.env.CI_PROJECT_ID || '') {
|
|
20
|
+
this.releaseService = new ReleaseService(gitlabToken, projectId);
|
|
21
|
+
this.milestoneService = new MilestoneService(gitlabToken, projectId);
|
|
22
|
+
this.tagService = new TagService(gitlabToken, projectId);
|
|
23
|
+
this.mergeRequestService = new MergeRequestService(gitlabToken, projectId);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Handle milestone webhook
|
|
27
|
+
*/
|
|
28
|
+
async handleMilestoneWebhook(payload) {
|
|
29
|
+
try {
|
|
30
|
+
// Validate payload with Zod
|
|
31
|
+
const validated = MilestoneWebhookPayloadSchema.parse(payload);
|
|
32
|
+
const actions = [];
|
|
33
|
+
const { object_attributes: milestone } = validated;
|
|
34
|
+
// Determine if this is a create or close event
|
|
35
|
+
const isNewMilestone = milestone.state === 'active' &&
|
|
36
|
+
new Date(milestone.created_at).getTime() ===
|
|
37
|
+
new Date(milestone.updated_at).getTime();
|
|
38
|
+
if (isNewMilestone) {
|
|
39
|
+
// Milestone created - create dev tag and branch
|
|
40
|
+
const action = await this.handleMilestoneCreate(validated);
|
|
41
|
+
if (action)
|
|
42
|
+
actions.push(action);
|
|
43
|
+
}
|
|
44
|
+
else if (milestone.state === 'closed') {
|
|
45
|
+
// Milestone closed - create RC
|
|
46
|
+
const action = await this.handleMilestoneClose(validated);
|
|
47
|
+
if (action)
|
|
48
|
+
actions.push(action);
|
|
49
|
+
}
|
|
50
|
+
return WebhookResponseSchema.parse({
|
|
51
|
+
success: true,
|
|
52
|
+
message: `Milestone ${milestone.title} processed`,
|
|
53
|
+
actions,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return WebhookResponseSchema.parse({
|
|
58
|
+
success: false,
|
|
59
|
+
message: `Webhook processing failed: ${error}`,
|
|
60
|
+
actions: [],
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Handle push webhook
|
|
66
|
+
*/
|
|
67
|
+
async handlePushWebhook(payload) {
|
|
68
|
+
try {
|
|
69
|
+
// Validate payload with Zod
|
|
70
|
+
const validated = PushWebhookPayloadSchema.parse(payload);
|
|
71
|
+
const actions = [];
|
|
72
|
+
// Only process release branch pushes (release/v0.X.x)
|
|
73
|
+
if (validated.ref.match(/^refs\/heads\/release\/v\d+\.\d+\.x$/)) {
|
|
74
|
+
const action = await this.handleReleaseBranchPush(validated);
|
|
75
|
+
if (action)
|
|
76
|
+
actions.push(action);
|
|
77
|
+
}
|
|
78
|
+
return WebhookResponseSchema.parse({
|
|
79
|
+
success: true,
|
|
80
|
+
message: 'Push webhook processed',
|
|
81
|
+
actions,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return WebhookResponseSchema.parse({
|
|
86
|
+
success: false,
|
|
87
|
+
message: `Webhook processing failed: ${error}`,
|
|
88
|
+
actions: [],
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Handle milestone creation
|
|
94
|
+
*/
|
|
95
|
+
async handleMilestoneCreate(payload) {
|
|
96
|
+
const { object_attributes: milestone } = payload;
|
|
97
|
+
const version = milestone.title.replace(/^v/, '');
|
|
98
|
+
// Extract major.minor from version (e.g., 0.3.0 -> 0.3)
|
|
99
|
+
const versionMatch = version.match(/^(\d+\.\d+)/);
|
|
100
|
+
if (!versionMatch) {
|
|
101
|
+
throw new Error(`Invalid version format: ${version}`);
|
|
102
|
+
}
|
|
103
|
+
const releaseBranch = `release/v${versionMatch[1]}.x`;
|
|
104
|
+
// Create initial dev tag on the appropriate release branch
|
|
105
|
+
const devTag = `v${version}-dev.0`;
|
|
106
|
+
await this.tagService.create({
|
|
107
|
+
name: devTag,
|
|
108
|
+
ref: releaseBranch,
|
|
109
|
+
message: `Initial dev tag for ${milestone.title}`,
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
type: 'milestone_created',
|
|
113
|
+
status: 'success',
|
|
114
|
+
details: {
|
|
115
|
+
milestoneId: milestone.id,
|
|
116
|
+
tag: devTag,
|
|
117
|
+
version,
|
|
118
|
+
releaseBranch,
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Handle milestone closure
|
|
124
|
+
*/
|
|
125
|
+
async handleMilestoneClose(payload) {
|
|
126
|
+
const { object_attributes: milestone } = payload;
|
|
127
|
+
const version = milestone.title.replace(/^v/, '');
|
|
128
|
+
// Get milestone statistics
|
|
129
|
+
const milestoneData = await this.milestoneService.read(milestone.id);
|
|
130
|
+
if (!milestoneData) {
|
|
131
|
+
throw new Error(`Milestone ${milestone.id} not found`);
|
|
132
|
+
}
|
|
133
|
+
// Check all issues are closed
|
|
134
|
+
if (milestoneData.statistics.openIssues > 0) {
|
|
135
|
+
throw new Error(`Cannot create RC: ${milestoneData.statistics.openIssues} issues still open`);
|
|
136
|
+
}
|
|
137
|
+
// Extract major.minor from version to determine release branch
|
|
138
|
+
const versionMatch = version.match(/^(\d+\.\d+)/);
|
|
139
|
+
if (!versionMatch) {
|
|
140
|
+
throw new Error(`Invalid version format: ${version}`);
|
|
141
|
+
}
|
|
142
|
+
const releaseBranch = `release/v${versionMatch[1]}.x`;
|
|
143
|
+
// Create RC tag on the release branch
|
|
144
|
+
const rcTag = `v${version}-rc.1`;
|
|
145
|
+
await this.tagService.create({
|
|
146
|
+
name: rcTag,
|
|
147
|
+
ref: releaseBranch,
|
|
148
|
+
message: `Release candidate for ${milestone.title}`,
|
|
149
|
+
});
|
|
150
|
+
// Create MR: release/v0.X.x → main
|
|
151
|
+
const mr = await this.mergeRequestService.create({
|
|
152
|
+
sourceBranch: releaseBranch,
|
|
153
|
+
targetBranch: 'main',
|
|
154
|
+
title: `Release ${milestone.title}`,
|
|
155
|
+
description: `Release candidate ${rcTag} for milestone ${milestone.title}`,
|
|
156
|
+
labels: ['release', 'automation'],
|
|
157
|
+
milestoneId: milestone.id,
|
|
158
|
+
});
|
|
159
|
+
return {
|
|
160
|
+
type: 'milestone_closed',
|
|
161
|
+
status: 'success',
|
|
162
|
+
details: {
|
|
163
|
+
milestoneId: milestone.id,
|
|
164
|
+
rcTag,
|
|
165
|
+
mergeRequestId: mr.id,
|
|
166
|
+
releaseBranch,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Handle release branch push
|
|
172
|
+
*/
|
|
173
|
+
async handleReleaseBranchPush(payload) {
|
|
174
|
+
// Auto-increment dev tag on release branch
|
|
175
|
+
// This would be implemented based on current version detection
|
|
176
|
+
// For now, return success
|
|
177
|
+
return {
|
|
178
|
+
type: 'dev_tag_incremented',
|
|
179
|
+
status: 'success',
|
|
180
|
+
details: {
|
|
181
|
+
branch: payload.ref,
|
|
182
|
+
commits: payload.commits.length,
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=webhook.service.js.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# test-skill
|
|
2
|
+
|
|
3
|
+
A test skill for unit testing
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @claude-skills/test-skill
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
This will automatically install the skill to `~/.claude/skills/`.
|
|
12
|
+
|
|
13
|
+
## Manual Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Clone or copy SKILL.md to Claude skills directory
|
|
17
|
+
cp node_modules/@claude-skills/test-skill/SKILL.md ~/.claude/skills/test-skill/
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Trigger Keywords
|
|
21
|
+
|
|
22
|
+
- testing
|
|
23
|
+
- validation
|
|
24
|
+
- unit-test
|
|
25
|
+
|
|
26
|
+
## Tags
|
|
27
|
+
|
|
28
|
+
`test`
|
|
29
|
+
|
|
30
|
+
## About Claude Skills
|
|
31
|
+
|
|
32
|
+
Claude Skills are reusable prompt templates that enhance Claude's capabilities for specific tasks.
|
|
33
|
+
|
|
34
|
+
## Generated by OSSA
|
|
35
|
+
|
|
36
|
+
This skill package was generated using [@bluefly/openstandardagents](https://www.npmjs.com/package/@bluefly/openstandardagents)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-skill
|
|
3
|
+
description: A test skill for unit testing
|
|
4
|
+
trigger_keywords:
|
|
5
|
+
- testing
|
|
6
|
+
- validation
|
|
7
|
+
- unit-test
|
|
8
|
+
version: 1.0.0
|
|
9
|
+
author: Test Author
|
|
10
|
+
tags:
|
|
11
|
+
- test
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# test-skill
|
|
15
|
+
|
|
16
|
+
A test skill for unit testing
|
|
17
|
+
|
|
18
|
+
## Instructions
|
|
19
|
+
|
|
20
|
+
This is a test skill for validating the export functionality.
|
|
21
|
+
|
|
22
|
+
## Capabilities
|
|
23
|
+
|
|
24
|
+
- testing
|
|
25
|
+
- validation
|
|
26
|
+
|
|
27
|
+
## When to Use
|
|
28
|
+
|
|
29
|
+
This skill activates when:
|
|
30
|
+
- Task involves: testing
|
|
31
|
+
- Task involves: validation
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Skill: test-skill
|
|
3
|
+
* A test skill for unit testing
|
|
4
|
+
*
|
|
5
|
+
* @generated by @bluefly/openstandardagents skills-export
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export type TriggerKeyword =
|
|
9
|
+
| 'testing'
|
|
10
|
+
| 'validation'
|
|
11
|
+
| 'unit-test';
|
|
12
|
+
|
|
13
|
+
export type SkillTag =
|
|
14
|
+
| 'test';
|
|
15
|
+
|
|
16
|
+
export interface ClaudeSkillMetadata {
|
|
17
|
+
name: 'test-skill';
|
|
18
|
+
description: string;
|
|
19
|
+
triggerKeywords: TriggerKeyword[];
|
|
20
|
+
version: '1.0.0';
|
|
21
|
+
author?: string;
|
|
22
|
+
tags?: SkillTag[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface ClaudeSkill {
|
|
26
|
+
metadata: ClaudeSkillMetadata;
|
|
27
|
+
skillPath: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
declare const skill: ClaudeSkill;
|
|
31
|
+
export default skill;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Post-install script to copy skill to ~/.claude/skills/
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const os = require('os');
|
|
9
|
+
|
|
10
|
+
const homeDir = os.homedir();
|
|
11
|
+
const claudeSkillsDir = path.join(homeDir, '.claude', 'skills');
|
|
12
|
+
const targetDir = path.join(claudeSkillsDir, 'test-skill');
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
// Create ~/.claude/skills/ if it doesn't exist
|
|
16
|
+
if (!fs.existsSync(claudeSkillsDir)) {
|
|
17
|
+
fs.mkdirSync(claudeSkillsDir, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Create target directory
|
|
21
|
+
if (!fs.existsSync(targetDir)) {
|
|
22
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Copy SKILL.md
|
|
26
|
+
const skillSource = path.join(__dirname, 'SKILL.md');
|
|
27
|
+
const skillTarget = path.join(targetDir, 'SKILL.md');
|
|
28
|
+
fs.copyFileSync(skillSource, skillTarget);
|
|
29
|
+
|
|
30
|
+
// Copy additional directories if they exist
|
|
31
|
+
const dirs = ['templates', 'knowledge', 'examples'];
|
|
32
|
+
for (const dir of dirs) {
|
|
33
|
+
const sourcePath = path.join(__dirname, dir);
|
|
34
|
+
if (fs.existsSync(sourcePath)) {
|
|
35
|
+
const targetPath = path.join(targetDir, dir);
|
|
36
|
+
fs.cpSync(sourcePath, targetPath, { recursive: true });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
console.log('✓ Skill installed to: ' + targetDir);
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error('Failed to install skill:', error.message);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@claude-skills/test-skill",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A test skill for unit testing",
|
|
5
|
+
"main": "SKILL.md",
|
|
6
|
+
"types": "index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"install": "node install.js"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"claude",
|
|
12
|
+
"claude-skill",
|
|
13
|
+
"ossa",
|
|
14
|
+
"ai",
|
|
15
|
+
"agent",
|
|
16
|
+
"test",
|
|
17
|
+
"testing",
|
|
18
|
+
"validation",
|
|
19
|
+
"unit-test"
|
|
20
|
+
],
|
|
21
|
+
"author": "Test Author",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"files": [
|
|
24
|
+
"SKILL.md",
|
|
25
|
+
"README.md",
|
|
26
|
+
"index.d.ts",
|
|
27
|
+
"install.js",
|
|
28
|
+
"templates/**",
|
|
29
|
+
"knowledge/**",
|
|
30
|
+
"examples/**"
|
|
31
|
+
],
|
|
32
|
+
"ossa": {
|
|
33
|
+
"type": "claude-skill",
|
|
34
|
+
"skillPath": "/var/folders/48/d86hncy50j93r_vzsv6knttr0000gn/T/ossa-export-test-1772826461079/test-skill"
|
|
35
|
+
}
|
|
36
|
+
}
|