diff --git a/.agents/skills/impeccable/scripts/lib/design-parser.mjs b/.agents/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.agents/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.agents/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.claude/skills/impeccable/scripts/lib/design-parser.mjs b/.claude/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.claude/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.claude/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.cursor/skills/impeccable/scripts/lib/design-parser.mjs b/.cursor/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.cursor/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.cursor/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.gemini/skills/impeccable/scripts/lib/design-parser.mjs b/.gemini/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.gemini/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.gemini/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.github/skills/impeccable/scripts/lib/design-parser.mjs b/.github/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.github/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.github/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.grok/skills/impeccable/scripts/lib/design-parser.mjs b/.grok/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.grok/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.grok/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.kiro/skills/impeccable/scripts/lib/design-parser.mjs b/.kiro/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.kiro/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.kiro/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.opencode/skills/impeccable/scripts/lib/design-parser.mjs b/.opencode/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.opencode/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.opencode/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.pi/skills/impeccable/scripts/lib/design-parser.mjs b/.pi/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.pi/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.pi/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.qoder/skills/impeccable/scripts/lib/design-parser.mjs b/.qoder/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.qoder/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.qoder/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.rovodev/skills/impeccable/scripts/lib/design-parser.mjs b/.rovodev/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.rovodev/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.rovodev/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.trae-cn/skills/impeccable/scripts/lib/design-parser.mjs b/.trae-cn/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.trae-cn/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.trae-cn/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.trae/skills/impeccable/scripts/lib/design-parser.mjs b/.trae/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.trae/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.trae/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/.vibe/skills/impeccable/scripts/lib/design-parser.mjs b/.vibe/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/.vibe/skills/impeccable/scripts/lib/design-parser.mjs +++ b/.vibe/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics') diff --git a/plugin/skills/impeccable/scripts/lib/design-parser.mjs b/plugin/skills/impeccable/scripts/lib/design-parser.mjs index a4b9e9483..5e2f2c286 100644 --- a/plugin/skills/impeccable/scripts/lib/design-parser.mjs +++ b/plugin/skills/impeccable/scripts/lib/design-parser.mjs @@ -330,17 +330,16 @@ function extractOverview(section) { if (!section) return null; const text = section.lines.join('\n'); const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/); - const keyChars = []; const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/); - if (keyCharMatch) { - for (const line of keyCharMatch[1].split('\n')) { - const m = line.match(/^\s*[-*]\s+(.+)$/); - if (m) keyChars.push(stripBold(m[1].trim())); - } - } + const keyChars = keyCharMatch + ? collectBullets(keyCharMatch[1].split('\n')).map((bullet) => stripBold(bullet.trim())) + : []; + const prose = keyCharMatch + ? text.slice(0, keyCharMatch.index) + text.slice(keyCharMatch.index + keyCharMatch[0].length) + : text; // Philosophy paragraphs: everything that isn't a rule header or key-char block - const paragraphs = collectParagraphs(section.lines).filter( + const paragraphs = collectParagraphs(prose.split('\n')).filter( (p) => !p.startsWith('**Creative North Star') && !p.startsWith('**Key Characteristics')