Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 40 additions & 4 deletions docs/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -1651,12 +1651,15 @@ These commands help you manage scheduled and configured Actor runs. Use them to

```sh
DESCRIPTION
Run saved Apify tasks (named Actor configurations). Only 'task run' is
available; create and manage tasks in Apify Console.
Run and publish saved Apify tasks (named Actor configurations). Create and
manage tasks in Apify Console.

SUBCOMMANDS
task run Executes predefined Actor task remotely using local
key-value store for input.
task run Executes predefined Actor task remotely using
local key-value store for input.
task publish Publishes the task on its public landing page.
task unpublish Unpublishes the task from its public landing
Comment thread
Janjiran marked this conversation as resolved.
page.
```

##### `apify task run`
Expand All @@ -1683,6 +1686,39 @@ FLAGS
-t, --timeout=<value> Timeout for the Task run in seconds.
Zero value means there is no timeout.
```

##### `apify task publish`

```sh
DESCRIPTION
Publishes the task on its public landing page.
The task must belong to a public Actor and have its public display
configuration set up on the task Publication tab in Apify Console. Requires
write access to the task and to its Actor.

USAGE
$ apify task publish <taskId>

ARGUMENTS
taskId Name of the task to publish. For example, "my-task" or
"username/my-task".
```

##### `apify task unpublish`

```sh
DESCRIPTION
Unpublishes the task from its public landing page.
The public display configuration is preserved, so the task can be published
again later. Requires write access to the task and to its Actor.

USAGE
$ apify task unpublish <taskId>

ARGUMENTS
taskId Name of the task to unpublish. For example, "my-task" or
"username/my-task".
```
<!-- task-commands-end -->
<!-- prettier-ignore-end -->

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@
"@skyra/jaro-winkler": "^1.1.1",
"adm-zip": "~0.6.0",
"ajv": "~8.20.0",
"apify-client": "^2.23.3",
"apify-client": "^2.25.0",
"archiver": "~8.0.0",
"axios": "^1.15.0",
"chalk": "~6.0.0",
Expand Down
12 changes: 6 additions & 6 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions scripts/generate-cli-docs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ const categories: Record<string, CommandsInCategory[]> = {
//
{ command: Commands.task },
{ command: Commands.taskRun },
{ command: Commands.taskPublish },
{ command: Commands.taskUnpublish },
],
'mcp': [
//
Expand Down
6 changes: 4 additions & 2 deletions src/commands/task/_index.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
import { ApifyCommand } from '../../lib/command-framework/apify-command.js';
import { TaskPublishCommand } from './publish.js';
import { TaskRunCommand } from './run.js';
import { TaskUnpublishCommand } from './unpublish.js';

export class TasksIndexCommand extends ApifyCommand<typeof TasksIndexCommand> {
static override name = 'task' as const;

static override description = `Run saved Apify tasks (named Actor configurations). Only 'task run' is available; create and manage tasks in Apify Console.`;
static override description = `Run and publish saved Apify tasks (named Actor configurations). Create and manage tasks in Apify Console.`;

static override group = 'Apify Console';

static override docsUrl = 'https://docs.apify.com/cli/docs/reference#apify-task';

static override subcommands = [TaskRunCommand];
static override subcommands = [TaskRunCommand, TaskPublishCommand, TaskUnpublishCommand];

async run() {
this.printHelp();
Expand Down
73 changes: 73 additions & 0 deletions src/commands/task/publish.ts
Comment thread
Janjiran marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import process from 'node:process';

import type { ApifyApiError } from 'apify-client';
import chalk from 'chalk';

import { ApifyCommand } from '../../lib/command-framework/apify-command.js';
import { Args } from '../../lib/command-framework/args.js';
import { CommandExitCodes } from '../../lib/consts.js';
import { error, success } from '../../lib/outputs.js';
import { getLocalUserInfo, getLoggedClientOrThrow } from '../../lib/utils.js';

export class TaskPublishCommand extends ApifyCommand<typeof TaskPublishCommand> {
static override name = 'publish' as const;

static override description =
'Publishes the task on its public landing page.\n' +
'The task must belong to a public Actor and have its public display configuration set up ' +
Comment thread
katzino marked this conversation as resolved.
'on the task Publication tab in Apify Console. ' +
'Requires write access to the task and to its Actor.';

static override examples = [
{
description: 'Publish a task by name.',
command: 'apify task publish my-task',
},
{
description: 'Publish a task by full name.',
command: 'apify task publish username/my-task',
},
];

static override docsUrl = 'https://docs.apify.com/cli/docs/reference#apify-task-publish';

static override args = {
taskId: Args.string({
required: true,
description: 'Name of the task to publish. For example, "my-task" or "username/my-task".',
}),
};

async run() {
const apifyClient = await getLoggedClientOrThrow();
const userInfo = await getLocalUserInfo();
const usernameOrId = userInfo.username || (userInfo.id as string);

const { taskId } = this.args;
const idOrName = taskId.includes('/') ? taskId : `${usernameOrId}/${taskId.toLowerCase()}`;
const taskClient = apifyClient.task(idOrName);

const task = await taskClient.get();
if (!task) {
error({ message: `Cannot find Task with name '${taskId}' in your account.` });
process.exitCode = CommandExitCodes.NotFound;
return;
}

try {
await taskClient.publish();

success({
message: `Task ${chalk.yellow(task.name)} has been published.`,
stdout: true,
});
} catch (err) {
const casted = err as ApifyApiError;

error({
Comment thread
katzino marked this conversation as resolved.
message: `Failed to publish task ${chalk.yellow(task.name)}\n ${casted.message || casted}`,
});
process.exitCode = CommandExitCodes.RunFailed;
}
}
}
72 changes: 72 additions & 0 deletions src/commands/task/unpublish.ts
Comment thread
Janjiran marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import process from 'node:process';

import type { ApifyApiError } from 'apify-client';
import chalk from 'chalk';

import { ApifyCommand } from '../../lib/command-framework/apify-command.js';
import { Args } from '../../lib/command-framework/args.js';
import { CommandExitCodes } from '../../lib/consts.js';
import { error, success } from '../../lib/outputs.js';
import { getLocalUserInfo, getLoggedClientOrThrow } from '../../lib/utils.js';

export class TaskUnpublishCommand extends ApifyCommand<typeof TaskUnpublishCommand> {
static override name = 'unpublish' as const;

static override description =
'Unpublishes the task from its public landing page.\n' +
'The public display configuration is preserved, so the task can be published again later. ' +
'Requires write access to the task and to its Actor.';

static override examples = [
{
description: 'Unpublish a task by name.',
command: 'apify task unpublish my-task',
},
{
description: 'Unpublish a task by full name.',
command: 'apify task unpublish username/my-task',
},
];

static override docsUrl = 'https://docs.apify.com/cli/docs/reference#apify-task-unpublish';

static override args = {
taskId: Args.string({
required: true,
description: 'Name of the task to unpublish. For example, "my-task" or "username/my-task".',
}),
};

async run() {
const apifyClient = await getLoggedClientOrThrow();
const userInfo = await getLocalUserInfo();
const usernameOrId = userInfo.username || (userInfo.id as string);

const { taskId } = this.args;
const idOrName = taskId.includes('/') ? taskId : `${usernameOrId}/${taskId.toLowerCase()}`;
const taskClient = apifyClient.task(idOrName);

const task = await taskClient.get();
if (!task) {
error({ message: `Cannot find Task with name '${taskId}' in your account.` });
process.exitCode = CommandExitCodes.NotFound;
return;
}

try {
await taskClient.unpublish();

success({
message: `Task ${chalk.yellow(task.name)} has been unpublished.`,
stdout: true,
});
} catch (err) {
const casted = err as ApifyApiError;

error({
message: `Failed to unpublish task ${chalk.yellow(task.name)}\n ${casted.message || casted}`,
});
process.exitCode = CommandExitCodes.RunFailed;
}
}
}