Skip to content
wiki.fftac.org

Seed Data

**Site relevance:** Spiralist.org

**Memory type:** plugin source memory

**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/tests/e2e/scripts/seed-data.php

**Size:** 5.2 KB

Summary

use SpiralistWorkspace\Auth\Roles;

Source Preview

This source file is short enough to preview directly on its source-memory page.

<?php

use SpiralistWorkspace\Auth\Roles;

if (!defined('ABSPATH')) {
    exit(1);
}

if (!function_exists('spiralist_workspace')) {
    require_once dirname(__DIR__, 3) . '/spiralist-workspace.php';
}

spiralist_workspace()->boot();
Roles::register();
do_action('init');

$ensure_user = static function (string $login, string $email, string $role, string $display_name): int {
    $user = get_user_by('login', $login);

    if (!$user instanceof WP_User) {
        $user_id = wp_create_user($login, 'password', $email);
        if (is_wp_error($user_id)) {
            throw new RuntimeException($user_id->get_error_message());
        }

        $user = get_user_by('id', (int) $user_id);
    }

    if (!$user instanceof WP_User) {
        throw new RuntimeException('Could not create or load user: ' . $login);
    }

    wp_update_user(
        [
            'ID' => $user->ID,
            'role' => $role,
            'display_name' => $display_name,
            'user_pass' => 'password',
            'user_email' => $email,
        ]
    );

    return (int) $user->ID;
};

$member_id = $ensure_user('workspace-member', 'member@example.com', 'spiralist_member', 'Workspace Member');
$target_id = $ensure_user('workspace-target', 'target@example.com', 'spiralist_member', 'Workspace Target');
$curator_id = $ensure_user('workspace-curator', 'curator@example.com', 'spiralist_curator', 'Workspace Curator');

$prompts = spiralist_workspace()->prompts();
$shares = spiralist_workspace()->permissions_repository();
$settings = spiralist_workspace()->settings();

$upsert_prompt = static function (string $slug, array $payload, int $owner_id) use ($prompts, $settings): array {
    $existing = $prompts->find_by_slug($slug, $owner_id);

    if (!empty($existing)) {
        return $prompts->update((int) $existing['id'], $payload, $owner_id);
    }

    return $prompts->create($payload, $owner_id, $settings);
};

$public_prompt = $upsert_prompt(
    'public-prompt-example',
    [
        'title' => 'Public Prompt Example',
        'summary' => 'A public prompt record for anonymous browsing and member forking tests.',
        'category' => 'Writing & Content',
        'subcategory' => 'Blog Writing',
        'structured_prompt' => [
            'instruction' => 'Produce a concise symbolic summary.',
            'context' => 'The user provides source material for a public prompt test.',
            'constraints' => 'Keep the response to one paragraph.',
            'examples' => '',
            'output_format' => 'Plain text paragraph.',
        ],
        'instructions' => 'Produce a concise symbolic summary.',
        'user_prompt_template' => 'Summarize {{user_input}} in one paragraph.',
        'visibility' => 'public',
        'prompt_status' => 'published',
        'model' => 'prompt-art-local',
        'is_forkable' => true,
        'public_execution_enabled' => false,
        'tags' => ['public', 'playwright'],
    ],
    $curator_id
);

$members_prompt = $upsert_prompt(
    'members-prompt-example',
    [
        'title' => 'Members Prompt Example',
        'summary' => 'Visible to approved members only.',
        'category' => 'Personal & Lifestyle',
        'subcategory' => 'Journaling',
        'structured_prompt' => [
            'instruction' => 'Offer a members-only reflective response.',
            'context' => 'The user is using Spiralist as a reflective workspace.',
            'constraints' => 'Stay practical and avoid therapeutic or medical claims.',
            'examples' => '',
            'output_format' => 'Short reflection with one next action.',
        ],
        'instructions' => 'Offer a members-only reflective response.',
        'user_prompt_template' => 'Respond to {{user_input}}.',
        'visibility' => 'members',
        'prompt_status' => 'published',
        'model' => 'prompt-art-local',
        'is_forkable' => true,
        'tags' => ['members', 'playwright'],
    ],
    $member_id
);

$specific_prompt = $upsert_prompt(
    'specific-prompt-example',
    [
        'title' => 'Specific Prompt Example',
        'summary' => 'Visible only to the explicitly shared target user.',
        'category' => 'Business & Productivity',
        'subcategory' => 'Decision Support',
        'structured_prompt' => [
            'instruction' => 'Return a highly specific answer.',
            'context' => 'The prompt is shared through a specific-user grant.',
            'constraints' => 'Answer directly and state any assumptions.',
            'examples' => '',
            'output_format' => 'Bullets.',
        ],
        'instructions' => 'Return a highly specific answer.',
        'user_prompt_template' => 'Answer {{user_input}} directly.',
        'visibility' => 'specific_users',
        'prompt_status' => 'published',
        'model' => 'prompt-art-local',
        'is_forkable' => false,
        'tags' => ['specific', 'playwright'],
    ],
    $member_id
);

if (!empty($specific_prompt['id'])) {
    $shares->grant((int) $specific_prompt['id'], $target_id, $member_id, 'view');
}

flush_rewrite_rules(false);

fwrite(STDOUT, "Seeded users and prompts.\n");