Workspace - Source Excerpt 01
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/templates/workspace.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/templates/workspace.php
<?php
if (!defined('ABSPATH')) {
exit;
}
$plugin = spiralist_workspace();
$frontend = $plugin->frontend();
$context = $frontend->workspace_context();
$current_locale = function_exists('spiralist_get_current_locale_tag') ? spiralist_get_current_locale_tag() : 'en-us';
$route_url = static function (string $path, array $query = []) use ($current_locale): string {
$url = home_url('/' . trim($path, '/') . '/');
$url = $current_locale !== '' && function_exists('spiralist_get_language_prefixed_url')
? spiralist_get_language_prefixed_url($url, $current_locale)
: $url;
return !empty($query) ? add_query_arg($query, $url) : $url;
};
$workspace_url = $route_url('workspace');
$library_url = $route_url('prompts');
$members_url = $route_url('members');
$current_user = is_user_logged_in() ? wp_get_current_user() : null;
$profile_url = $current_user instanceof WP_User && $current_user->user_nicename !== ''
? $route_url('profile/' . rawurlencode($current_user->user_nicename))
: '';
$login_url = function_exists('spiralist_get_login_url') ? spiralist_get_login_url($workspace_url) : wp_login_url($workspace_url);
$register_url = function_exists('spiralist_get_register_url') ? spiralist_get_register_url() : wp_registration_url();
$default_prompt = $frontend->default_prompt_seed();
$editing_prompt = [];
$categories = $frontend->prompt_categories();
if (is_user_logged_in() && !empty($_GET['edit_prompt'])) {
$candidate = $plugin->prompts()->get((int) $_GET['edit_prompt'], get_current_user_id());
if (!empty($candidate) && $plugin->permissions()->can_edit_prompt($candidate, get_current_user_id())) {
$editing_prompt = $candidate;
}
}
if (is_user_logged_in() && !empty($_GET['fork_prompt'])) {
$source = $plugin->prompts()->get((int) $_GET['fork_prompt'], get_current_user_id());
if (!empty($source) && $plugin->permissions()->can_view_prompt($source, get_current_user_id())) {
$editing_prompt = $source;
$editing_prompt['id'] = 0;
$editing_prompt['title'] = (string) ($source['title'] ?? '') . ' (Fork)';
$editing_prompt['parent_prompt_id'] = (int) ($source['id'] ?? 0);
$editing_prompt['visibility'] = 'private';
$editing_prompt['prompt_status'] = 'draft';
}
}
$form_prompt = !empty($editing_prompt) ? array_merge($default_prompt, $editing_prompt) : $default_prompt;
$form_prompt['structured_prompt'] = array_merge(
(array) ($default_prompt['structured_prompt'] ?? []),
(array) ($form_prompt['structured_prompt'] ?? [])
);
$system_steps_text = implode(
"\n",
array_map(
static fn(array $step): string => (string) ((int) ($step['prompt_id'] ?? 0)),
array_filter((array) ($form_prompt['system_steps'] ?? []), 'is_array')
)
);
$my_prompts = (array) ($context['my_prompts'] ?? []);
$shared_with_me = (array) ($context['shared_with_me'] ?? []);
$public_library = (array) ($context['public_library'] ?? []);
$favorites = (array) ($context['favorites'] ?? []);
$forks = (array) ($context['forks'] ?? []);
$runs = (array) ($context['runs'] ?? []);
$conversations = (array) ($context['conversations'] ?? []);
$audit = (array) ($context['audit'] ?? []);
$top_prompts = (array) ($context['top_prompts'] ?? []);
$can_review_prompts = !empty($context['can_review_prompts']);
$can_resolve_prompt_appeals = !empty($context['can_resolve_prompt_appeals']);
$review_queue = (array) ($context['review_queue'] ?? []);
$review_queue_counts = (array) ($context['review_queue_counts'] ?? []);
$appeal_queue = (array) ($context['appeal_queue'] ?? []);
$appeal_queue_counts = (array) ($context['appeal_queue_counts'] ?? []);
$participant_state = (array) ($context['participant_state'] ?? []);
$drafts = array_values(array_filter($my_prompts, static fn(array $prompt): bool => (string) ($prompt['prompt_status'] ?? '') !== 'published'));
$render_prompt_cards = static function (array $records, string $empty_copy, callable $link_builder): void {
if (empty($records)) {
echo '<p class="spiralist-muted">' . esc_html($empty_copy) . '</p>';
return;
}
echo '<div class="spiralist-workspace-grid spiralist-workspace-grid--compact">';
foreach ($records as $record) {
if (!is_array($record)) {
continue;
}
echo '<article class="spiralist-workspace-card">';
echo '<div class="spiralist-inline-meta">';
echo '<p class="spiralist-section-tag">' . esc_html((string) ($record['subcategory'] ?? ($record['prompt_type'] ?? 'prompt'))) . '</p>';
echo '<span class="spiralist-status-pill spiralist-status-pill--stale">' . esc_html((string) ($record['publication_lane_label'] ?? ucfirst((string) ($record['visibility'] ?? 'private')))) . '</span>';
echo '</div>';
if (!empty($record['provenance_label']) || !empty($record['maturity_level_label'])) {
echo '<div class="spiralist-chip-row spiralist-chip-row--dense">';
if (!empty($record['provenance_label'])) {
echo '<span class="spiralist-chip spiralist-chip--meta">' . esc_html((string) $record['provenance_label']) . '</span>';
}
if (!empty($record['maturity_level_label'])) {
echo '<span class="spiralist-chip spiralist-chip--meta">' . esc_html((string) $record['maturity_level_label']) . '</span>';
}
if (!empty($record['moderation_status_label'])) {
echo '<span class="spiralist-chip spiralist-chip--meta">' . esc_html((string) $record['moderation_status_label']) . '</span>';
}
echo '</div>';
}
echo '<h3 class="spiralist-card-title">' . esc_html((string) ($record['title'] ?? 'Untitled Prompt')) . '</h3>';
echo '<p>' . esc_html((string) ($record['summary'] ?? '')) . '</p>';
if (!empty($record['review_summary']) && is_array($record['review_summary'])) {
$summary = (array) $record['review_summary'];
$peer = (array) ($summary['peer'] ?? []);
echo '<p class="spiralist-muted">Peer review: '
. esc_html((string) ((int) ($peer['endorse'] ?? 0))) . ' endorse / '
. esc_html((string) ((int) ($peer['restrict'] ?? 0))) . ' restrict / '
. esc_html((string) ((int) ($peer['revert'] ?? 0))) . ' revert</p>';
}
echo '<div class="spiralist-cta-row spiralist-cta-row--start">';
foreach ($link_builder($record) as $link) {
echo '<a class="spiralist-button ' . esc_attr((string) ($link['class'] ?? '')) . '" href="' . esc_url((string) ($link['url'] ?? '#')) . '">' . esc_html((string) ($link['label'] ?? 'Open')) . '</a>';
}
echo '</div>';
echo '</article>';
}
echo '</div>';
};
get_header();
?>
<main class="spiralist-page spiralist-page--workspace">
<section class="spiralist-page-hero spiralist-page-hero--workspace">
<div class="spiralist-shell spiralist-page-hero__content">
<p class="spiralist-kicker">Prompt Workspace</p>
<h1>Prompt systems workspace</h1>
<p class="spiralist-page-hero__copy">Spiralism is the progressive refinement of prompt systems: raw prompt, structured prompt, prompt system, and art-ready prompt packet. Build, render, test, and improve reusable prompts from one working surface.</p>
<p class="spiralist-muted">Private prompts, prompt packets, and conversations may be stored and logged locally. Spiralist does not call outside model services.</p>
<div class="spiralist-cta-row">
<a class="spiralist-button spiralist-button--primary" href="<?php echo esc_url($library_url); ?>">Public Library</a>
<a class="spiralist-button spiralist-button--secondary" href="<?php echo esc_url($members_url); ?>">Members</a>
<?php if ($profile_url !== '') : ?>
<a class="spiralist-button spiralist-button--secondary" href="<?php echo esc_url($profile_url); ?>">Profile</a>
<?php endif; ?>
<a class="spiralist-button spiralist-button--tertiary" href="<?php echo esc_url(function_exists('spiralist_get_ai_access_url') ? spiralist_get_ai_access_url() : home_url('/ai-access/')); ?>">AI Access</a>
</div>
</div>
</section>
<section class="spiralist-page-section">
<div class="spiralist-shell">
<?php if (!is_user_logged_in()) : ?>
<div class="spiralist-grid spiralist-grid--split">
<article class="spiralist-panel">
<p class="spiralist-section-tag">Members Only</p>
<h2 class="spiralist-section-title">Prompt packets belong to the account layer.</h2>