@lumenflow/cli 2.21.1 → 3.1.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/LICENSE +13 -185
- package/README.md +62 -48
- package/dist/agent-issues-query.js +2 -0
- package/dist/agent-issues-query.js.map +1 -1
- package/dist/agent-log-issue.js +2 -0
- package/dist/agent-log-issue.js.map +1 -1
- package/dist/agent-session-end.js +2 -0
- package/dist/agent-session-end.js.map +1 -1
- package/dist/agent-session.js +2 -0
- package/dist/agent-session.js.map +1 -1
- package/dist/backlog-prune.js +2 -0
- package/dist/backlog-prune.js.map +1 -1
- package/dist/cli-entry-point.js +30 -1
- package/dist/cli-entry-point.js.map +1 -1
- package/dist/commands/integrate.js +2 -0
- package/dist/commands/integrate.js.map +1 -1
- package/dist/commands.js +7 -1
- package/dist/commands.js.map +1 -1
- package/dist/config-get.js +58 -0
- package/dist/config-get.js.map +1 -0
- package/dist/config-set.js +289 -0
- package/dist/config-set.js.map +1 -0
- package/dist/delegation-list.js +2 -0
- package/dist/delegation-list.js.map +1 -1
- package/dist/deps-add.js +2 -0
- package/dist/deps-add.js.map +1 -1
- package/dist/deps-remove.js +2 -0
- package/dist/deps-remove.js.map +1 -1
- package/dist/docs-sync.js +2 -0
- package/dist/docs-sync.js.map +1 -1
- package/dist/doctor.js +2 -0
- package/dist/doctor.js.map +1 -1
- package/dist/file-delete.js +2 -0
- package/dist/file-delete.js.map +1 -1
- package/dist/file-edit.js +2 -0
- package/dist/file-edit.js.map +1 -1
- package/dist/file-read.js +2 -0
- package/dist/file-read.js.map +1 -1
- package/dist/file-write.js +2 -0
- package/dist/file-write.js.map +1 -1
- package/dist/flow-bottlenecks.js +2 -0
- package/dist/flow-bottlenecks.js.map +1 -1
- package/dist/flow-report.js +2 -0
- package/dist/flow-report.js.map +1 -1
- package/dist/formatters.js +151 -0
- package/dist/formatters.js.map +1 -0
- package/dist/gate-defaults.js +2 -10
- package/dist/gate-defaults.js.map +1 -1
- package/dist/gate-registry.js +2 -11
- package/dist/gate-registry.js.map +1 -1
- package/dist/gates-graceful-degradation.js +2 -0
- package/dist/gates-graceful-degradation.js.map +1 -1
- package/dist/gates-plan-resolvers.js +2 -0
- package/dist/gates-plan-resolvers.js.map +1 -1
- package/dist/gates-runners.js +3 -1
- package/dist/gates-runners.js.map +1 -1
- package/dist/gates-types.js +2 -11
- package/dist/gates-types.js.map +1 -1
- package/dist/gates-utils.js +2 -0
- package/dist/gates-utils.js.map +1 -1
- package/dist/gates.js +7 -2
- package/dist/gates.js.map +1 -1
- package/dist/git-branch.js +2 -0
- package/dist/git-branch.js.map +1 -1
- package/dist/git-diff.js +2 -0
- package/dist/git-diff.js.map +1 -1
- package/dist/git-log.js +7 -3
- package/dist/git-log.js.map +1 -1
- package/dist/git-status.js +2 -0
- package/dist/git-status.js.map +1 -1
- package/dist/guard-locked.js +2 -0
- package/dist/guard-locked.js.map +1 -1
- package/dist/guard-main-branch.js +2 -0
- package/dist/guard-main-branch.js.map +1 -1
- package/dist/guard-worktree-commit.js +3 -1
- package/dist/guard-worktree-commit.js.map +1 -1
- package/dist/hooks/auto-checkpoint-utils.js +2 -0
- package/dist/hooks/auto-checkpoint-utils.js.map +1 -1
- package/dist/hooks/enforcement-checks.js +2 -0
- package/dist/hooks/enforcement-checks.js.map +1 -1
- package/dist/hooks/enforcement-generator.js +2 -0
- package/dist/hooks/enforcement-generator.js.map +1 -1
- package/dist/hooks/enforcement-sync.js +2 -0
- package/dist/hooks/enforcement-sync.js.map +1 -1
- package/dist/hooks/generators/auto-checkpoint.js +2 -0
- package/dist/hooks/generators/auto-checkpoint.js.map +1 -1
- package/dist/hooks/generators/enforce-worktree.js +2 -0
- package/dist/hooks/generators/enforce-worktree.js.map +1 -1
- package/dist/hooks/generators/index.js +2 -0
- package/dist/hooks/generators/index.js.map +1 -1
- package/dist/hooks/generators/pre-compact-checkpoint.js +2 -0
- package/dist/hooks/generators/pre-compact-checkpoint.js.map +1 -1
- package/dist/hooks/generators/require-wu.js +2 -0
- package/dist/hooks/generators/require-wu.js.map +1 -1
- package/dist/hooks/generators/session-start-recovery.js +2 -0
- package/dist/hooks/generators/session-start-recovery.js.map +1 -1
- package/dist/hooks/generators/signal-utils.js +2 -0
- package/dist/hooks/generators/signal-utils.js.map +1 -1
- package/dist/hooks/generators/warn-incomplete.js +2 -0
- package/dist/hooks/generators/warn-incomplete.js.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/init-detection.js +2 -0
- package/dist/init-detection.js.map +1 -1
- package/dist/init-lane-validation.js +2 -0
- package/dist/init-lane-validation.js.map +1 -1
- package/dist/init-scaffolding.js +2 -0
- package/dist/init-scaffolding.js.map +1 -1
- package/dist/init-templates.js +8 -0
- package/dist/init-templates.js.map +1 -1
- package/dist/init.js +36 -3
- package/dist/init.js.map +1 -1
- package/dist/initiative-add-wu.js +2 -0
- package/dist/initiative-add-wu.js.map +1 -1
- package/dist/initiative-bulk-assign-wus.js +2 -0
- package/dist/initiative-bulk-assign-wus.js.map +1 -1
- package/dist/initiative-create.js +2 -0
- package/dist/initiative-create.js.map +1 -1
- package/dist/initiative-edit.js +2 -0
- package/dist/initiative-edit.js.map +1 -1
- package/dist/initiative-list.js +2 -0
- package/dist/initiative-list.js.map +1 -1
- package/dist/initiative-plan.js +2 -0
- package/dist/initiative-plan.js.map +1 -1
- package/dist/initiative-remove-wu.js +2 -0
- package/dist/initiative-remove-wu.js.map +1 -1
- package/dist/initiative-status.js +2 -0
- package/dist/initiative-status.js.map +1 -1
- package/dist/lane-edit.js +320 -0
- package/dist/lane-edit.js.map +1 -0
- package/dist/lane-health.js +2 -0
- package/dist/lane-health.js.map +1 -1
- package/dist/lane-lifecycle-process.js +2 -0
- package/dist/lane-lifecycle-process.js.map +1 -1
- package/dist/lane-lock.js +2 -0
- package/dist/lane-lock.js.map +1 -1
- package/dist/lane-setup.js +2 -0
- package/dist/lane-setup.js.map +1 -1
- package/dist/lane-status.js +2 -0
- package/dist/lane-status.js.map +1 -1
- package/dist/lane-suggest.js +2 -0
- package/dist/lane-suggest.js.map +1 -1
- package/dist/lane-validate.js +2 -0
- package/dist/lane-validate.js.map +1 -1
- package/dist/lifecycle-regression-harness.js +2 -0
- package/dist/lifecycle-regression-harness.js.map +1 -1
- package/dist/lumenflow-upgrade.js +2 -0
- package/dist/lumenflow-upgrade.js.map +1 -1
- package/dist/mem-checkpoint.js +72 -3
- package/dist/mem-checkpoint.js.map +1 -1
- package/dist/mem-cleanup.js +2 -0
- package/dist/mem-cleanup.js.map +1 -1
- package/dist/mem-context.js +2 -0
- package/dist/mem-context.js.map +1 -1
- package/dist/mem-create.js +2 -0
- package/dist/mem-create.js.map +1 -1
- package/dist/mem-delete.js +2 -0
- package/dist/mem-delete.js.map +1 -1
- package/dist/mem-export.js +2 -0
- package/dist/mem-export.js.map +1 -1
- package/dist/mem-inbox.js +2 -0
- package/dist/mem-inbox.js.map +1 -1
- package/dist/mem-index.js +2 -0
- package/dist/mem-index.js.map +1 -1
- package/dist/mem-init.js +2 -0
- package/dist/mem-init.js.map +1 -1
- package/dist/mem-profile.js +2 -0
- package/dist/mem-profile.js.map +1 -1
- package/dist/mem-promote.js +2 -0
- package/dist/mem-promote.js.map +1 -1
- package/dist/mem-ready.js +2 -0
- package/dist/mem-ready.js.map +1 -1
- package/dist/mem-recover.js +2 -0
- package/dist/mem-recover.js.map +1 -1
- package/dist/mem-signal.js +2 -0
- package/dist/mem-signal.js.map +1 -1
- package/dist/mem-start.js +2 -0
- package/dist/mem-start.js.map +1 -1
- package/dist/mem-summarize.js +2 -0
- package/dist/mem-summarize.js.map +1 -1
- package/dist/mem-triage.js +2 -0
- package/dist/mem-triage.js.map +1 -1
- package/dist/merge-block.js +2 -0
- package/dist/merge-block.js.map +1 -1
- package/dist/metrics-cli.js +2 -0
- package/dist/metrics-cli.js.map +1 -1
- package/dist/metrics-snapshot.js +2 -0
- package/dist/metrics-snapshot.js.map +1 -1
- package/dist/onboard.js +532 -0
- package/dist/onboard.js.map +1 -0
- package/dist/onboarding-smoke-test.js +2 -0
- package/dist/onboarding-smoke-test.js.map +1 -1
- package/dist/orchestrate-init-status.js +2 -0
- package/dist/orchestrate-init-status.js.map +1 -1
- package/dist/orchestrate-initiative.js +17 -1
- package/dist/orchestrate-initiative.js.map +1 -1
- package/dist/orchestrate-monitor.js +2 -0
- package/dist/orchestrate-monitor.js.map +1 -1
- package/dist/pack-author.js +340 -0
- package/dist/pack-author.js.map +1 -0
- package/dist/pack-hash.js +103 -0
- package/dist/pack-hash.js.map +1 -0
- package/dist/pack-install.js +578 -0
- package/dist/pack-install.js.map +1 -0
- package/dist/pack-publish.js +283 -0
- package/dist/pack-publish.js.map +1 -0
- package/dist/pack-scaffold.js +271 -0
- package/dist/pack-scaffold.js.map +1 -0
- package/dist/pack-search.js +144 -0
- package/dist/pack-search.js.map +1 -0
- package/dist/pack-validate.js +314 -0
- package/dist/pack-validate.js.map +1 -0
- package/dist/plan-create.js +2 -0
- package/dist/plan-create.js.map +1 -1
- package/dist/plan-edit.js +2 -0
- package/dist/plan-edit.js.map +1 -1
- package/dist/plan-link.js +2 -0
- package/dist/plan-link.js.map +1 -1
- package/dist/plan-promote.js +2 -0
- package/dist/plan-promote.js.map +1 -1
- package/dist/public-manifest.js +104 -13
- package/dist/public-manifest.js.map +1 -1
- package/dist/release.js +3 -1
- package/dist/release.js.map +1 -1
- package/dist/rotate-progress.js +2 -0
- package/dist/rotate-progress.js.map +1 -1
- package/dist/session-coordinator.js +2 -0
- package/dist/session-coordinator.js.map +1 -1
- package/dist/shared-validators.js +2 -0
- package/dist/shared-validators.js.map +1 -1
- package/dist/signal-cleanup.js +2 -0
- package/dist/signal-cleanup.js.map +1 -1
- package/dist/state-bootstrap.js +2 -0
- package/dist/state-bootstrap.js.map +1 -1
- package/dist/state-cleanup.js +2 -0
- package/dist/state-cleanup.js.map +1 -1
- package/dist/state-doctor-fix.js +2 -0
- package/dist/state-doctor-fix.js.map +1 -1
- package/dist/state-doctor-stamps.js +2 -0
- package/dist/state-doctor-stamps.js.map +1 -1
- package/dist/state-doctor.js +2 -0
- package/dist/state-doctor.js.map +1 -1
- package/dist/strict-progress.js +2 -0
- package/dist/strict-progress.js.map +1 -1
- package/dist/sync-templates.js +2 -0
- package/dist/sync-templates.js.map +1 -1
- package/dist/task-claim.js +669 -0
- package/dist/task-claim.js.map +1 -0
- package/dist/trace-gen.js +2 -0
- package/dist/trace-gen.js.map +1 -1
- package/dist/validate-agent-skills.js +2 -0
- package/dist/validate-agent-skills.js.map +1 -1
- package/dist/validate-agent-sync.js +2 -0
- package/dist/validate-agent-sync.js.map +1 -1
- package/dist/validate-backlog-sync.js +2 -0
- package/dist/validate-backlog-sync.js.map +1 -1
- package/dist/validate-skills-spec.js +2 -0
- package/dist/validate-skills-spec.js.map +1 -1
- package/dist/validate.js +2 -0
- package/dist/validate.js.map +1 -1
- package/dist/validator-defaults.js +2 -14
- package/dist/validator-defaults.js.map +1 -1
- package/dist/validator-registry.js +2 -12
- package/dist/validator-registry.js.map +1 -1
- package/dist/workspace-init.js +323 -0
- package/dist/workspace-init.js.map +1 -0
- package/dist/wu-block.js +3 -1
- package/dist/wu-block.js.map +1 -1
- package/dist/wu-brief.js +2 -0
- package/dist/wu-brief.js.map +1 -1
- package/dist/wu-claim-branch.js +2 -0
- package/dist/wu-claim-branch.js.map +1 -1
- package/dist/wu-claim-cloud.js +2 -0
- package/dist/wu-claim-cloud.js.map +1 -1
- package/dist/wu-claim-mode.js +2 -0
- package/dist/wu-claim-mode.js.map +1 -1
- package/dist/wu-claim-output.js +2 -0
- package/dist/wu-claim-output.js.map +1 -1
- package/dist/wu-claim-repair-guidance.js +2 -0
- package/dist/wu-claim-repair-guidance.js.map +1 -1
- package/dist/wu-claim-resume-handler.js +2 -0
- package/dist/wu-claim-resume-handler.js.map +1 -1
- package/dist/wu-claim-state.js +2 -1
- package/dist/wu-claim-state.js.map +1 -1
- package/dist/wu-claim-validation.js +2 -0
- package/dist/wu-claim-validation.js.map +1 -1
- package/dist/wu-claim-worktree.js +2 -0
- package/dist/wu-claim-worktree.js.map +1 -1
- package/dist/wu-claim.js +3 -1
- package/dist/wu-claim.js.map +1 -1
- package/dist/wu-cleanup-cloud.js +2 -0
- package/dist/wu-cleanup-cloud.js.map +1 -1
- package/dist/wu-cleanup.js +2 -0
- package/dist/wu-cleanup.js.map +1 -1
- package/dist/wu-code-path-coverage.js +2 -0
- package/dist/wu-code-path-coverage.js.map +1 -1
- package/dist/wu-create-cloud.js +2 -12
- package/dist/wu-create-cloud.js.map +1 -1
- package/dist/wu-create-content.js +2 -0
- package/dist/wu-create-content.js.map +1 -1
- package/dist/wu-create-readiness.js +2 -0
- package/dist/wu-create-readiness.js.map +1 -1
- package/dist/wu-create-validation.js +2 -0
- package/dist/wu-create-validation.js.map +1 -1
- package/dist/wu-create.js +2 -0
- package/dist/wu-create.js.map +1 -1
- package/dist/wu-delegate.js +2 -0
- package/dist/wu-delegate.js.map +1 -1
- package/dist/wu-delete.js +2 -0
- package/dist/wu-delete.js.map +1 -1
- package/dist/wu-deps.js +2 -0
- package/dist/wu-deps.js.map +1 -1
- package/dist/wu-done-auto-cleanup.js +2 -0
- package/dist/wu-done-auto-cleanup.js.map +1 -1
- package/dist/wu-done-check.js +2 -0
- package/dist/wu-done-check.js.map +1 -1
- package/dist/wu-done-cloud.js +2 -0
- package/dist/wu-done-cloud.js.map +1 -1
- package/dist/wu-done-decay.js +2 -0
- package/dist/wu-done-decay.js.map +1 -1
- package/dist/wu-done.js +7 -3
- package/dist/wu-done.js.map +1 -1
- package/dist/wu-edit-operations.js +2 -0
- package/dist/wu-edit-operations.js.map +1 -1
- package/dist/wu-edit-validators.js +2 -0
- package/dist/wu-edit-validators.js.map +1 -1
- package/dist/wu-edit.js +2 -0
- package/dist/wu-edit.js.map +1 -1
- package/dist/wu-infer-lane.js +2 -0
- package/dist/wu-infer-lane.js.map +1 -1
- package/dist/wu-preflight.js +2 -0
- package/dist/wu-preflight.js.map +1 -1
- package/dist/wu-prep.js +2 -0
- package/dist/wu-prep.js.map +1 -1
- package/dist/wu-proto.js +2 -0
- package/dist/wu-proto.js.map +1 -1
- package/dist/wu-prune.js +2 -0
- package/dist/wu-prune.js.map +1 -1
- package/dist/wu-recover.js +2 -0
- package/dist/wu-recover.js.map +1 -1
- package/dist/wu-release.js +2 -0
- package/dist/wu-release.js.map +1 -1
- package/dist/wu-repair.js +2 -0
- package/dist/wu-repair.js.map +1 -1
- package/dist/wu-sandbox.js +2 -0
- package/dist/wu-sandbox.js.map +1 -1
- package/dist/wu-spawn-completion.js +2 -0
- package/dist/wu-spawn-completion.js.map +1 -1
- package/dist/wu-spawn-prompt-builders.js +88 -28
- package/dist/wu-spawn-prompt-builders.js.map +1 -1
- package/dist/wu-spawn-strategy-resolver.js +2 -0
- package/dist/wu-spawn-strategy-resolver.js.map +1 -1
- package/dist/wu-spawn.js +2 -0
- package/dist/wu-spawn.js.map +1 -1
- package/dist/wu-state-cloud.js +2 -0
- package/dist/wu-state-cloud.js.map +1 -1
- package/dist/wu-status.js +2 -0
- package/dist/wu-status.js.map +1 -1
- package/dist/wu-unblock.js +2 -0
- package/dist/wu-unblock.js.map +1 -1
- package/dist/wu-unlock-lane.js +2 -0
- package/dist/wu-unlock-lane.js.map +1 -1
- package/dist/wu-validate.js +2 -0
- package/dist/wu-validate.js.map +1 -1
- package/package.json +40 -11
- package/templates/core/UPGRADING.md.template +2 -2
- package/templates/core/ai/onboarding/release-process.md.template +1 -1
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Copyright (c) 2026 Hellmai Ltd
|
|
3
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
4
|
+
/**
|
|
5
|
+
* @file pack-publish.ts
|
|
6
|
+
* Publish a LumenFlow domain pack to a registry (WU-1838)
|
|
7
|
+
*
|
|
8
|
+
* Runs pack:validate, creates a tarball, and uploads to the registry
|
|
9
|
+
* with authentication. Requires a GitHub OAuth token or registry token.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* pnpm pack:publish --id my-pack
|
|
13
|
+
* pnpm pack:publish --pack-root ./path/to/pack --registry-url https://custom.registry.dev
|
|
14
|
+
* pnpm pack:publish --id my-pack --token ghp_xxx
|
|
15
|
+
*/
|
|
16
|
+
import { execFile } from 'node:child_process';
|
|
17
|
+
import { mkdirSync } from 'node:fs';
|
|
18
|
+
import { readFile } from 'node:fs/promises';
|
|
19
|
+
import { join, resolve } from 'node:path';
|
|
20
|
+
import { tmpdir } from 'node:os';
|
|
21
|
+
import { promisify } from 'node:util';
|
|
22
|
+
import YAML from 'yaml';
|
|
23
|
+
import { DomainPackManifestSchema, PACK_MANIFEST_FILE_NAME, UTF8_ENCODING, } from '@lumenflow/kernel';
|
|
24
|
+
import { createWUParser, WU_OPTIONS } from '@lumenflow/core';
|
|
25
|
+
import { validatePack } from './pack-validate.js';
|
|
26
|
+
import { computePackHash } from './pack-hash.js';
|
|
27
|
+
import { runCLI } from './cli-entry-point.js';
|
|
28
|
+
export const LOG_PREFIX = '[pack:publish]';
|
|
29
|
+
const execFileAsync = promisify(execFile);
|
|
30
|
+
// --- Constants ---
|
|
31
|
+
const DEFAULT_PACKS_ROOT = 'packages/@lumenflow/packs';
|
|
32
|
+
const DEFAULT_REGISTRY_URL = 'https://registry.lumenflow.dev';
|
|
33
|
+
const TOKEN_ENV_VAR = 'LUMENFLOW_REGISTRY_TOKEN';
|
|
34
|
+
const GITHUB_TOKEN_ENV_VAR = 'GITHUB_TOKEN';
|
|
35
|
+
/**
|
|
36
|
+
* Create a gzipped tarball of the pack directory contents.
|
|
37
|
+
*
|
|
38
|
+
* Uses system `tar` command for simplicity and zero dependencies.
|
|
39
|
+
* The tarball is named `<packId>-<version>.tar.gz`.
|
|
40
|
+
*
|
|
41
|
+
* @returns Absolute path to the created tarball file
|
|
42
|
+
* @throws Error if tar command fails
|
|
43
|
+
*/
|
|
44
|
+
export async function createPackTarball(options) {
|
|
45
|
+
const { packRoot, outputDir, packId, version } = options;
|
|
46
|
+
const absolutePackRoot = resolve(packRoot);
|
|
47
|
+
const tarballName = `${packId}-${version}.tar.gz`;
|
|
48
|
+
const tarballPath = resolve(outputDir, tarballName);
|
|
49
|
+
await execFileAsync('tar', ['-czf', tarballPath, '-C', absolutePackRoot, '.']);
|
|
50
|
+
return tarballPath;
|
|
51
|
+
}
|
|
52
|
+
// --- Core publish function ---
|
|
53
|
+
/**
|
|
54
|
+
* Publish a pack to a registry.
|
|
55
|
+
*
|
|
56
|
+
* Steps:
|
|
57
|
+
* 1. Validate the pack using pack:validate
|
|
58
|
+
* 2. Read manifest to get pack ID and version
|
|
59
|
+
* 3. Compute integrity hash
|
|
60
|
+
* 4. Create tarball of pack contents
|
|
61
|
+
* 5. Upload tarball to registry with authentication
|
|
62
|
+
*
|
|
63
|
+
* Returns PublishPackResult with success=false if validation fails,
|
|
64
|
+
* token is missing, or upload fails.
|
|
65
|
+
*/
|
|
66
|
+
export async function publishPack(options) {
|
|
67
|
+
const { packRoot, registryUrl, token, uploadFn } = options;
|
|
68
|
+
const absolutePackRoot = resolve(packRoot);
|
|
69
|
+
// 0. Validate token
|
|
70
|
+
if (!token) {
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
error: `Authentication token is required. Set ${TOKEN_ENV_VAR} or ${GITHUB_TOKEN_ENV_VAR} environment variable, or pass --token.`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// 1. Validate the pack
|
|
77
|
+
let validation;
|
|
78
|
+
try {
|
|
79
|
+
validation = await validatePack({ packRoot: absolutePackRoot });
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
83
|
+
return { success: false, error: `Pack validation failed: ${message}` };
|
|
84
|
+
}
|
|
85
|
+
if (!validation.allPassed) {
|
|
86
|
+
return {
|
|
87
|
+
success: false,
|
|
88
|
+
error: `Pack validation failed. Run pack:validate --pack-root ${absolutePackRoot} for details.`,
|
|
89
|
+
validation,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// 2. Read manifest for pack ID and version
|
|
93
|
+
let packId;
|
|
94
|
+
let version;
|
|
95
|
+
try {
|
|
96
|
+
const manifestPath = join(absolutePackRoot, PACK_MANIFEST_FILE_NAME);
|
|
97
|
+
const manifestRaw = await readFile(manifestPath, UTF8_ENCODING);
|
|
98
|
+
const manifest = DomainPackManifestSchema.parse(YAML.parse(manifestRaw));
|
|
99
|
+
packId = manifest.id;
|
|
100
|
+
version = manifest.version;
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
104
|
+
return { success: false, error: `Failed to read manifest: ${message}` };
|
|
105
|
+
}
|
|
106
|
+
// 3. Compute integrity hash
|
|
107
|
+
let integrity;
|
|
108
|
+
try {
|
|
109
|
+
integrity = await computePackHash({ packRoot: absolutePackRoot });
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
113
|
+
return { success: false, error: `Integrity hash computation failed: ${message}` };
|
|
114
|
+
}
|
|
115
|
+
// 4. Create tarball
|
|
116
|
+
let tarballPath;
|
|
117
|
+
try {
|
|
118
|
+
const outputDir = join(tmpdir(), `lumenflow-publish-${packId}-${Date.now()}`);
|
|
119
|
+
mkdirSync(outputDir, { recursive: true });
|
|
120
|
+
tarballPath = await createPackTarball({
|
|
121
|
+
packRoot: absolutePackRoot,
|
|
122
|
+
outputDir,
|
|
123
|
+
packId,
|
|
124
|
+
version,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
129
|
+
return { success: false, error: `Tarball creation failed: ${message}` };
|
|
130
|
+
}
|
|
131
|
+
// 5. Upload to registry
|
|
132
|
+
try {
|
|
133
|
+
await uploadFn({
|
|
134
|
+
registryUrl,
|
|
135
|
+
packId,
|
|
136
|
+
version,
|
|
137
|
+
tarballPath,
|
|
138
|
+
token,
|
|
139
|
+
integrity,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
144
|
+
return {
|
|
145
|
+
success: false,
|
|
146
|
+
error: message,
|
|
147
|
+
packId,
|
|
148
|
+
version,
|
|
149
|
+
integrity,
|
|
150
|
+
tarballPath,
|
|
151
|
+
validation,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
success: true,
|
|
156
|
+
packId,
|
|
157
|
+
version,
|
|
158
|
+
integrity,
|
|
159
|
+
tarballPath,
|
|
160
|
+
validation,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// --- Default upload implementation ---
|
|
164
|
+
/**
|
|
165
|
+
* Default upload function using Node.js built-in fetch.
|
|
166
|
+
*
|
|
167
|
+
* Sends a multipart/form-data POST to the registry's publish endpoint:
|
|
168
|
+
* POST {registryUrl}/api/registry/packs/{packId}/versions/{version}
|
|
169
|
+
*
|
|
170
|
+
* Headers:
|
|
171
|
+
* Authorization: Bearer {token}
|
|
172
|
+
*
|
|
173
|
+
* Body (multipart/form-data):
|
|
174
|
+
* tarball: pack tarball file (.tar.gz)
|
|
175
|
+
* integrity: sha256 hash string
|
|
176
|
+
* version: semver version string
|
|
177
|
+
*/
|
|
178
|
+
export async function defaultUploadFn(options) {
|
|
179
|
+
const { registryUrl, packId, version, tarballPath, token, integrity } = options;
|
|
180
|
+
const { readFile: readFileFs } = await import('node:fs/promises');
|
|
181
|
+
const { basename } = await import('node:path');
|
|
182
|
+
const tarballBuffer = await readFileFs(tarballPath);
|
|
183
|
+
const url = `${registryUrl}/api/registry/packs/${packId}/versions/${version}`;
|
|
184
|
+
const formData = new FormData();
|
|
185
|
+
formData.append('tarball', new Blob([tarballBuffer], { type: 'application/gzip' }), basename(tarballPath));
|
|
186
|
+
formData.append('integrity', integrity);
|
|
187
|
+
formData.append('version', version);
|
|
188
|
+
const response = await fetch(url, {
|
|
189
|
+
method: 'POST',
|
|
190
|
+
headers: {
|
|
191
|
+
Authorization: `Bearer ${token}`,
|
|
192
|
+
},
|
|
193
|
+
body: formData,
|
|
194
|
+
});
|
|
195
|
+
if (!response.ok) {
|
|
196
|
+
const body = await response.text().catch(() => 'No response body');
|
|
197
|
+
throw new Error(`Registry upload failed: ${String(response.status)} ${response.statusText} - ${body}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// --- CLI options ---
|
|
201
|
+
const PACK_PUBLISH_OPTIONS = {
|
|
202
|
+
packId: {
|
|
203
|
+
name: 'id',
|
|
204
|
+
flags: '--id <packId>',
|
|
205
|
+
description: 'Pack ID to publish (resolves under --packs-root)',
|
|
206
|
+
},
|
|
207
|
+
packsRoot: {
|
|
208
|
+
name: 'packsRoot',
|
|
209
|
+
flags: '--packs-root <dir>',
|
|
210
|
+
description: `Root directory containing packs (default: "${DEFAULT_PACKS_ROOT}")`,
|
|
211
|
+
},
|
|
212
|
+
packRoot: {
|
|
213
|
+
name: 'packRoot',
|
|
214
|
+
flags: '--pack-root <dir>',
|
|
215
|
+
description: 'Direct path to pack directory (overrides --id and --packs-root)',
|
|
216
|
+
},
|
|
217
|
+
registryUrl: {
|
|
218
|
+
name: 'registryUrl',
|
|
219
|
+
flags: '--registry-url <url>',
|
|
220
|
+
description: `Registry URL (default: "${DEFAULT_REGISTRY_URL}")`,
|
|
221
|
+
},
|
|
222
|
+
token: {
|
|
223
|
+
name: 'token',
|
|
224
|
+
flags: '--token <token>',
|
|
225
|
+
description: `Authentication token (default: $${TOKEN_ENV_VAR} or $${GITHUB_TOKEN_ENV_VAR})`,
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
/**
|
|
229
|
+
* CLI main entry point for pack:publish
|
|
230
|
+
*/
|
|
231
|
+
export async function main() {
|
|
232
|
+
const opts = createWUParser({
|
|
233
|
+
name: 'pack-publish',
|
|
234
|
+
description: 'Publish a LumenFlow domain pack to a registry',
|
|
235
|
+
options: [
|
|
236
|
+
PACK_PUBLISH_OPTIONS.packId,
|
|
237
|
+
PACK_PUBLISH_OPTIONS.packsRoot,
|
|
238
|
+
PACK_PUBLISH_OPTIONS.packRoot,
|
|
239
|
+
PACK_PUBLISH_OPTIONS.registryUrl,
|
|
240
|
+
PACK_PUBLISH_OPTIONS.token,
|
|
241
|
+
WU_OPTIONS.force,
|
|
242
|
+
],
|
|
243
|
+
});
|
|
244
|
+
const packId = opts.id;
|
|
245
|
+
const packsRoot = opts.packsRoot ?? DEFAULT_PACKS_ROOT;
|
|
246
|
+
const directPackRoot = opts.packRoot;
|
|
247
|
+
const registryUrl = opts.registryUrl ?? DEFAULT_REGISTRY_URL;
|
|
248
|
+
const token = opts.token ??
|
|
249
|
+
process.env[TOKEN_ENV_VAR] ??
|
|
250
|
+
process.env[GITHUB_TOKEN_ENV_VAR] ??
|
|
251
|
+
'';
|
|
252
|
+
let resolvedPackRoot;
|
|
253
|
+
if (directPackRoot) {
|
|
254
|
+
resolvedPackRoot = resolve(directPackRoot);
|
|
255
|
+
}
|
|
256
|
+
else if (packId) {
|
|
257
|
+
resolvedPackRoot = resolve(packsRoot, packId);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
console.error(`${LOG_PREFIX} Error: Provide --id <packId> or --pack-root <dir>`);
|
|
261
|
+
process.exit(1);
|
|
262
|
+
}
|
|
263
|
+
console.log(`${LOG_PREFIX} Publishing pack at: ${resolvedPackRoot}`);
|
|
264
|
+
console.log(`${LOG_PREFIX} Registry: ${registryUrl}`);
|
|
265
|
+
const result = await publishPack({
|
|
266
|
+
packRoot: resolvedPackRoot,
|
|
267
|
+
registryUrl,
|
|
268
|
+
token,
|
|
269
|
+
uploadFn: defaultUploadFn,
|
|
270
|
+
});
|
|
271
|
+
if (!result.success) {
|
|
272
|
+
console.error(`${LOG_PREFIX} Publish failed: ${result.error}`);
|
|
273
|
+
process.exit(1);
|
|
274
|
+
}
|
|
275
|
+
console.log(`${LOG_PREFIX} Published "${result.packId}" v${result.version} successfully.`);
|
|
276
|
+
console.log(`${LOG_PREFIX} Integrity: ${result.integrity}`);
|
|
277
|
+
console.log(`${LOG_PREFIX} Tarball: ${result.tarballPath}`);
|
|
278
|
+
}
|
|
279
|
+
// Run if executed directly
|
|
280
|
+
if (import.meta.main) {
|
|
281
|
+
void runCLI(main);
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=pack-publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-publish.js","sourceRoot":"","sources":["../src/pack-publish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Copyright (c) 2026 Hellmai Ltd
|
|
3
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
4
|
+
/**
|
|
5
|
+
* @file pack-scaffold.ts
|
|
6
|
+
* Scaffold a new LumenFlow domain pack (WU-1823)
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* pnpm pack:scaffold --id my-domain --version 0.1.0
|
|
10
|
+
* pnpm pack:scaffold --id my-domain --version 0.1.0 --task-type investigation --tool my-tool
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import YAML from 'yaml';
|
|
15
|
+
import { createWUParser, WU_OPTIONS } from '@lumenflow/core';
|
|
16
|
+
import { runCLI } from './cli-entry-point.js';
|
|
17
|
+
export const LOG_PREFIX = '[pack:scaffold]';
|
|
18
|
+
// --- Validation constants ---
|
|
19
|
+
const PACK_ID_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
20
|
+
const SEMVER_PATTERN = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z-.]+)?(?:\+[0-9A-Za-z-.]+)?$/;
|
|
21
|
+
const DEFAULT_TASK_TYPE = 'task';
|
|
22
|
+
const DEFAULT_OUTPUT_DIR = 'packs';
|
|
23
|
+
// --- Validation functions ---
|
|
24
|
+
/**
|
|
25
|
+
* Validate a pack ID is kebab-case, non-empty, starts with letter.
|
|
26
|
+
* @throws {Error} if pack ID is invalid
|
|
27
|
+
*/
|
|
28
|
+
export function validatePackId(packId) {
|
|
29
|
+
if (!packId || !PACK_ID_PATTERN.test(packId)) {
|
|
30
|
+
throw new Error(`Invalid pack ID "${packId}". Must be kebab-case (lowercase letters, numbers, hyphens), ` +
|
|
31
|
+
`start with a letter, and not start/end with a hyphen. Examples: "my-domain", "customer-support"`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validate a version string is valid semver.
|
|
36
|
+
* @throws {Error} if version is invalid
|
|
37
|
+
*/
|
|
38
|
+
export function validateVersion(version) {
|
|
39
|
+
if (!version || !SEMVER_PATTERN.test(version)) {
|
|
40
|
+
throw new Error(`Invalid version "${version}". Must be valid semver (e.g., "0.1.0", "1.0.0", "2.3.4-beta.1")`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// --- Template generators ---
|
|
44
|
+
function generateManifestYaml(options) {
|
|
45
|
+
const { packId, version, taskTypes, toolNames } = options;
|
|
46
|
+
const tools = toolNames.map((toolName) => ({
|
|
47
|
+
name: toolName,
|
|
48
|
+
entry: `tool-impl/${toolName}.ts#${toCamelCase(toolName)}Tool`,
|
|
49
|
+
permission: 'read',
|
|
50
|
+
required_scopes: [
|
|
51
|
+
{
|
|
52
|
+
type: 'path',
|
|
53
|
+
pattern: '**',
|
|
54
|
+
access: 'read',
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
}));
|
|
58
|
+
const manifest = {
|
|
59
|
+
id: packId,
|
|
60
|
+
version,
|
|
61
|
+
task_types: taskTypes,
|
|
62
|
+
tools,
|
|
63
|
+
policies: [],
|
|
64
|
+
evidence_types: [],
|
|
65
|
+
state_aliases: {},
|
|
66
|
+
lane_templates: [],
|
|
67
|
+
};
|
|
68
|
+
return YAML.stringify(manifest, { lineWidth: 120 });
|
|
69
|
+
}
|
|
70
|
+
function generateToolImpl(toolName, packId) {
|
|
71
|
+
const camelName = toCamelCase(toolName);
|
|
72
|
+
return `// ${packId} pack - ${toolName} tool implementation
|
|
73
|
+
//
|
|
74
|
+
// This file contains the runtime logic for the "${toolName}" tool.
|
|
75
|
+
// It is invoked by the LumenFlow kernel when an agent calls this tool.
|
|
76
|
+
|
|
77
|
+
import type { ToolRequest, ToolContext, ToolResult } from '@lumenflow/kernel';
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* ${toolName} tool handler.
|
|
81
|
+
*
|
|
82
|
+
* @param request - The tool invocation request from the kernel
|
|
83
|
+
* @param context - Execution context (workspace, task, scopes)
|
|
84
|
+
* @returns Tool result with output or error
|
|
85
|
+
*/
|
|
86
|
+
export async function ${camelName}Tool(
|
|
87
|
+
request: ToolRequest,
|
|
88
|
+
context: ToolContext,
|
|
89
|
+
): Promise<ToolResult> {
|
|
90
|
+
// TODO: Implement ${toolName} logic
|
|
91
|
+
return {
|
|
92
|
+
success: true,
|
|
93
|
+
output: \`${toolName} executed for task \${context.taskId}\`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
`;
|
|
97
|
+
}
|
|
98
|
+
function generateToolDescriptor(toolName) {
|
|
99
|
+
const camelName = toCamelCase(toolName);
|
|
100
|
+
return `// Tool descriptor for "${toolName}"
|
|
101
|
+
//
|
|
102
|
+
// This file re-exports the tool implementation for use in the manifest.
|
|
103
|
+
// The manifest.yaml references tool-impl/${toolName}.ts#${camelName}Tool
|
|
104
|
+
|
|
105
|
+
export { ${camelName}Tool } from '../tool-impl/${toolName}.js';
|
|
106
|
+
`;
|
|
107
|
+
}
|
|
108
|
+
function generateReadme(packId, version) {
|
|
109
|
+
return `# ${packId}
|
|
110
|
+
|
|
111
|
+
LumenFlow domain pack - version ${version}
|
|
112
|
+
|
|
113
|
+
## Overview
|
|
114
|
+
|
|
115
|
+
This pack provides domain-specific tools and policies for the LumenFlow kernel.
|
|
116
|
+
|
|
117
|
+
## Structure
|
|
118
|
+
|
|
119
|
+
\`\`\`
|
|
120
|
+
${packId}/
|
|
121
|
+
manifest.yaml # Pack manifest (tools, policies, task types)
|
|
122
|
+
tool-impl/ # Tool runtime implementations
|
|
123
|
+
tools/ # Tool descriptor re-exports
|
|
124
|
+
README.md # This file
|
|
125
|
+
\`\`\`
|
|
126
|
+
|
|
127
|
+
## Getting Started
|
|
128
|
+
|
|
129
|
+
1. Define your task types in \`manifest.yaml\`
|
|
130
|
+
2. Implement tool logic in \`tool-impl/\`
|
|
131
|
+
3. Register tools in the manifest
|
|
132
|
+
4. Validate with: \`pnpm pack:validate --id ${packId}\`
|
|
133
|
+
|
|
134
|
+
## Tools
|
|
135
|
+
|
|
136
|
+
See \`manifest.yaml\` for the list of registered tools.
|
|
137
|
+
`;
|
|
138
|
+
}
|
|
139
|
+
// --- Helpers ---
|
|
140
|
+
function toCamelCase(kebab) {
|
|
141
|
+
return kebab.replace(/-([a-z0-9])/g, (_match, letter) => letter.toUpperCase());
|
|
142
|
+
}
|
|
143
|
+
// --- Core scaffold function ---
|
|
144
|
+
/**
|
|
145
|
+
* Scaffold a new domain pack directory structure.
|
|
146
|
+
*
|
|
147
|
+
* Creates:
|
|
148
|
+
* - <outputDir>/<packId>/manifest.yaml
|
|
149
|
+
* - <outputDir>/<packId>/tool-impl/<toolName>.ts (for each tool)
|
|
150
|
+
* - <outputDir>/<packId>/tools/<toolName>.ts (for each tool)
|
|
151
|
+
* - <outputDir>/<packId>/README.md
|
|
152
|
+
*
|
|
153
|
+
* @throws {Error} if pack ID or version is invalid, or directory already exists
|
|
154
|
+
*/
|
|
155
|
+
export function scaffoldPack(options) {
|
|
156
|
+
const { outputDir, packId, version, taskTypes, toolNames = [] } = options;
|
|
157
|
+
// Validate inputs
|
|
158
|
+
validatePackId(packId);
|
|
159
|
+
validateVersion(version);
|
|
160
|
+
const resolvedTaskTypes = taskTypes && taskTypes.length > 0 ? taskTypes : [DEFAULT_TASK_TYPE];
|
|
161
|
+
const packDir = join(outputDir, packId);
|
|
162
|
+
// Prevent overwriting
|
|
163
|
+
if (existsSync(packDir)) {
|
|
164
|
+
throw new Error(`Pack directory "${packDir}" already exists. Remove it first or choose a different ID.`);
|
|
165
|
+
}
|
|
166
|
+
// Create directory structure
|
|
167
|
+
const toolImplDir = join(packDir, 'tool-impl');
|
|
168
|
+
const toolsDir = join(packDir, 'tools');
|
|
169
|
+
mkdirSync(toolImplDir, { recursive: true });
|
|
170
|
+
mkdirSync(toolsDir, { recursive: true });
|
|
171
|
+
const filesCreated = [];
|
|
172
|
+
// Generate manifest.yaml
|
|
173
|
+
const manifestContent = generateManifestYaml({
|
|
174
|
+
packId,
|
|
175
|
+
version,
|
|
176
|
+
taskTypes: resolvedTaskTypes,
|
|
177
|
+
toolNames,
|
|
178
|
+
});
|
|
179
|
+
const manifestPath = join(packDir, 'manifest.yaml');
|
|
180
|
+
writeFileSync(manifestPath, manifestContent, 'utf-8');
|
|
181
|
+
filesCreated.push(manifestPath);
|
|
182
|
+
// Generate tool files
|
|
183
|
+
for (const toolName of toolNames) {
|
|
184
|
+
const implPath = join(toolImplDir, `${toolName}.ts`);
|
|
185
|
+
writeFileSync(implPath, generateToolImpl(toolName, packId), 'utf-8');
|
|
186
|
+
filesCreated.push(implPath);
|
|
187
|
+
const descPath = join(toolsDir, `${toolName}.ts`);
|
|
188
|
+
writeFileSync(descPath, generateToolDescriptor(toolName), 'utf-8');
|
|
189
|
+
filesCreated.push(descPath);
|
|
190
|
+
}
|
|
191
|
+
// Generate README
|
|
192
|
+
const readmePath = join(packDir, 'README.md');
|
|
193
|
+
writeFileSync(readmePath, generateReadme(packId, version), 'utf-8');
|
|
194
|
+
filesCreated.push(readmePath);
|
|
195
|
+
return { packDir, filesCreated };
|
|
196
|
+
}
|
|
197
|
+
// --- CLI options ---
|
|
198
|
+
const PACK_SCAFFOLD_OPTIONS = {
|
|
199
|
+
packId: {
|
|
200
|
+
name: 'id',
|
|
201
|
+
flags: '--id <packId>',
|
|
202
|
+
description: 'Pack ID in kebab-case (e.g., "my-domain", "customer-support")',
|
|
203
|
+
},
|
|
204
|
+
version: {
|
|
205
|
+
name: 'version',
|
|
206
|
+
flags: '--version <version>',
|
|
207
|
+
description: 'Pack version in semver format (e.g., "0.1.0")',
|
|
208
|
+
},
|
|
209
|
+
taskType: {
|
|
210
|
+
name: 'taskType',
|
|
211
|
+
flags: '--task-type <type>',
|
|
212
|
+
description: 'Task type name (repeatable)',
|
|
213
|
+
isRepeatable: true,
|
|
214
|
+
},
|
|
215
|
+
tool: {
|
|
216
|
+
name: 'tool',
|
|
217
|
+
flags: '--tool <name>',
|
|
218
|
+
description: 'Tool name to scaffold (repeatable)',
|
|
219
|
+
isRepeatable: true,
|
|
220
|
+
},
|
|
221
|
+
output: {
|
|
222
|
+
name: 'output',
|
|
223
|
+
flags: '--output <dir>',
|
|
224
|
+
description: `Output directory (default: "${DEFAULT_OUTPUT_DIR}")`,
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
/**
|
|
228
|
+
* CLI main entry point for pack:scaffold
|
|
229
|
+
*/
|
|
230
|
+
export async function main() {
|
|
231
|
+
const opts = createWUParser({
|
|
232
|
+
name: 'pack-scaffold',
|
|
233
|
+
description: 'Scaffold a new LumenFlow domain pack',
|
|
234
|
+
options: [
|
|
235
|
+
PACK_SCAFFOLD_OPTIONS.packId,
|
|
236
|
+
PACK_SCAFFOLD_OPTIONS.version,
|
|
237
|
+
PACK_SCAFFOLD_OPTIONS.taskType,
|
|
238
|
+
PACK_SCAFFOLD_OPTIONS.tool,
|
|
239
|
+
PACK_SCAFFOLD_OPTIONS.output,
|
|
240
|
+
WU_OPTIONS.force,
|
|
241
|
+
],
|
|
242
|
+
required: ['id', 'version'],
|
|
243
|
+
});
|
|
244
|
+
const packId = opts.id;
|
|
245
|
+
const version = opts.version;
|
|
246
|
+
const taskTypes = opts.taskType ?? [];
|
|
247
|
+
const toolNames = opts.tool ?? [];
|
|
248
|
+
const outputDir = opts.output ?? DEFAULT_OUTPUT_DIR;
|
|
249
|
+
console.log(`${LOG_PREFIX} Scaffolding pack "${packId}" v${version}...`);
|
|
250
|
+
const result = scaffoldPack({
|
|
251
|
+
outputDir,
|
|
252
|
+
packId,
|
|
253
|
+
version,
|
|
254
|
+
taskTypes: taskTypes.length > 0 ? taskTypes : undefined,
|
|
255
|
+
toolNames: toolNames.length > 0 ? toolNames : undefined,
|
|
256
|
+
});
|
|
257
|
+
console.log(`${LOG_PREFIX} Pack scaffolded at: ${result.packDir}`);
|
|
258
|
+
console.log(`${LOG_PREFIX} Files created:`);
|
|
259
|
+
for (const file of result.filesCreated) {
|
|
260
|
+
console.log(` - ${file}`);
|
|
261
|
+
}
|
|
262
|
+
console.log(`${LOG_PREFIX} Next steps:`);
|
|
263
|
+
console.log(` 1. Edit manifest.yaml to define your tools and policies`);
|
|
264
|
+
console.log(` 2. Implement tool logic in tool-impl/`);
|
|
265
|
+
console.log(` 3. Validate with: pnpm pack:validate --id ${packId}`);
|
|
266
|
+
}
|
|
267
|
+
// Run if executed directly
|
|
268
|
+
if (import.meta.main) {
|
|
269
|
+
void runCLI(main);
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=pack-scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-scaffold.js","sourceRoot":"","sources":["../src/pack-scaffold.ts"],"names":[],"mappings":"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"}
|