Rename to Grimoired, update domain to grimoi.red, add resource system

- Rename Grimaired -> Grimoired everywhere (title, nav, descriptions, token keys)
- Update domain from skills.here.run.place to grimoi.red
- Add Grimoired logo with description on homepage
- Add accordion behavior for Quick install / Quick push sections
- Add generic resource system (skills, agents, output-styles, rules)
- Add resource registry, editor, search, and file manager components
This commit is contained in:
Alejandro Martinez
2026-02-13 14:24:53 +01:00
committed by Alejandro Martinez
parent aa477a553b
commit 17423fb3b9
27 changed files with 4389 additions and 181 deletions

View File

@@ -16,7 +16,7 @@
<div class="w-full max-w-md rounded-2xl border border-white/[0.08] bg-[var(--color-surface-200)] p-6 shadow-2xl">
<h3 class="text-lg font-semibold text-white mb-1">Author Verification</h3>
<p class="text-sm text-gray-500 mb-4">
This skill is owned by <strong class="text-gray-300">{{ authorName || authorEmail }}</strong>. Enter your token to edit.
This resource is owned by <strong class="text-gray-300">{{ authorName || authorEmail }}</strong>. Enter your token to edit.
</p>
<form @submit.prevent="verify">
@@ -44,7 +44,7 @@
<button
type="button"
@click="forkSkill"
@click="forkResource"
class="text-sm text-[var(--color-accent-400)] hover:text-[var(--color-accent-300)] transition-colors"
>
Fork instead
@@ -72,8 +72,11 @@ const props = defineProps<{
authorEmail?: string;
authorName?: string;
authorHasToken?: boolean;
resourceType?: string;
}>();
const type = props.resourceType || 'skills';
const showModal = ref(false);
const token = ref('');
const error = ref('');
@@ -82,12 +85,11 @@ const tokenInput = ref<HTMLInputElement>();
async function handleClick() {
if (!props.authorEmail || !props.authorHasToken) {
window.location.href = `/${props.slug}/edit`;
window.location.href = `/${type}/${props.slug}/edit`;
return;
}
// Try saved token first
const saved = localStorage.getItem('skillshere-token') || '';
const saved = localStorage.getItem('grimoired-token') || '';
if (saved) {
try {
const res = await fetch('/api/auth/verify', {
@@ -96,8 +98,8 @@ async function handleClick() {
body: JSON.stringify({ email: props.authorEmail, token: saved }),
});
if (res.ok) {
localStorage.setItem('skillshere-token', saved);
window.location.href = `/${props.slug}/edit`;
localStorage.setItem('grimoired-token', saved);
window.location.href = `/${type}/${props.slug}/edit`;
return;
}
} catch { /* fall through to modal */ }
@@ -126,9 +128,8 @@ async function verify() {
return;
}
// Store token for the editor to use
localStorage.setItem('skillshere-token', token.value);
window.location.href = `/${props.slug}/edit`;
localStorage.setItem('grimoired-token', token.value);
window.location.href = `/${type}/${props.slug}/edit`;
} catch {
error.value = 'Could not verify token';
} finally {
@@ -136,8 +137,8 @@ async function verify() {
}
}
function forkSkill() {
function forkResource() {
showModal.value = false;
window.location.href = `/new?from=${encodeURIComponent(props.slug)}`;
window.location.href = `/${type}/new?from=${encodeURIComponent(props.slug)}`;
}
</script>