decocms
Version:
CLI for managing deco.chat apps & projects
90 lines ⢠3.98 kB
JavaScript
import inquirer from "inquirer";
import { getConfig, readWranglerConfig, writeConfigFile, } from "../../lib/config.js";
import { promptIntegrations } from "../../lib/prompt-integrations.js";
import { readSession } from "../../lib/session.js";
import process from "node:process";
export async function addCommand({ workspace, local }) {
try {
// Check if user has a session
const session = await readSession();
if (!session) {
console.error("ā No session found. Please run 'deco login' first.");
return;
}
// Get current config
const config = await getConfig({
inlineOptions: { workspace, local },
}).catch(() => ({
workspace: workspace || session.workspace || "default",
bindings: [],
local: local || false,
enable_workflows: true,
}));
console.log(`š Using workspace: ${config.workspace}`);
console.log("š Fetching available integrations...");
// Prompt user to select integrations
const selectedBindings = await promptIntegrations(config.local, config.workspace);
if (selectedBindings.length === 0) {
console.log("ā¹ļø No integrations selected. Nothing to add.");
return;
}
console.log(`ā
Selected ${selectedBindings.length} integration(s)`);
// Prompt for binding names for each integration
const newBindings = [];
for (const binding of selectedBindings) {
// Cast to the proper type since promptIntegrations always returns with integration_id
const integrationBinding = binding;
const { bindingName } = await inquirer.prompt([
{
type: "input",
name: "bindingName",
message: `Enter binding name for integration "${integrationBinding.integration_id}":`,
default: integrationBinding.name,
validate: (value) => {
if (!value.trim()) {
return "Binding name cannot be empty";
}
if (!/^[A-Z_][A-Z0-9_]*$/.test(value)) {
return "Binding name must be uppercase with underscores (e.g., MY_INTEGRATION)";
}
return true;
},
},
]);
newBindings.push({
name: bindingName,
type: "mcp",
integration_id: integrationBinding.integration_id,
});
}
// Read current wrangler config and get existing bindings
const currentWranglerConfig = await readWranglerConfig();
const currentBindings = (currentWranglerConfig.deco?.bindings ||
[]);
// Simply concat arrays (no deduplication)
const allBindings = [...currentBindings, ...newBindings];
// Update config with new bindings
const updatedConfig = {
...config,
bindings: allBindings,
};
// Write updated config
await writeConfigFile(updatedConfig);
console.log(`ā
Added ${newBindings.length} integration(s) successfully!`);
newBindings.forEach((binding) => {
const id = "integration_id" in binding
? binding.integration_id
: "integration_name" in binding
? binding.integration_name
: "unknown";
console.log(` - ${binding.name} (${id})`);
});
console.log("\nš” Run 'deco gen' to update your environment types.");
console.log("š Your integrations are ready to use!");
}
catch (error) {
console.error("ā Failed to add integrations:", error instanceof Error ? error.message : String(error));
process.exit(1);
}
}
//# sourceMappingURL=add.js.map