jenkinsci / jenkinsci/workflow-cps-plugin

[JENKINS-41896] Static nested classes in global libraries can not be used from other classes in same package

Open
#1,276 3 comments 0 reactions 0 assignees View on GitHub
component:workflow-cps-global-lib-plugin component:workflow-cps-plugin imported-jira-issue priority:minor resolution:unresolved
Dominant language
Java
Stars
186
Forks
213
Avg merge
12h 12m
Merged PRs (30d)
8

Description

Baseline global Library code:

Here is the base code for the example.

I will add to each example where I change the code.

jenkins.mkobit.example.FirstClass

package jenkins.mkobit.example

class FirstClass {
FirstClass() {
}
}


jenkins.mkobit.example.SiblingClass

package jenkins.mkobit.example

class SiblingClass {
static class SiblingInner {
}
}


Jenkinsfile examples:

FirstClass creates an instance of sibling class

jenkins.mkobit.example.FirstClass

package jenkins.mkobit.example

class FirstClass {
FirstClass() {
new SiblingClass()
}
}

Jenkinsfile

@​Library('pipelineUtilities@​mkobit-global-cps-test')

import jenkins.mkobit.example.FirstClass

def firstClass = new FirstClass()

Result: SUCCESS

FirstClass creates an instance of sibling static nested class in constructor

jenkins.mkobit.example.FirstClass

package jenkins.mkobit.example

class FirstClass {
FirstClass() {
new SiblingClass.SiblingInner()
}
}

Jenkinsfile

@​Library('pipelineUtilities@​mkobit-global-cps-test')

import jenkins.mkobit.example.FirstClass

def firstClass = new FirstClass()

Result: FAILURE - I expect this to work similarly to how normal Groovy code works. Instead, I get a failed compilation issue.

```
BUG! exception in phase 'semantic analysis' in source unit 'WorkflowScript' The lookup for jenkins.mkobit.example.FirstClass caused a failed compilaton. There should not have been any compilation from this call.
at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:190)
at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:170)
at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:126)
at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:676)
at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:308)
at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1218)
at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:176)
at org.codehaus.groovy.control.CompilationUnit$11.call(CompilationUnit.java:651)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:931)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:542)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:429)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:392)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:221)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:405)
Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/var/jenkins_home/jobs/ff/builds/29/libs/pipelineUtilities/src/jenkins/mkobit/example/FirstClass.groovy: 5: unable to resolve class SiblingClass.SiblingInner
@ line 5, column 5.
new SiblingClass.SiblingInner()

```

FirstClass creates an instance of sibling static nested class when full classname imported in classfile

jenkins.mkobit.example.FirstClass

package jenkins.mkobit.example

import jenkins.mkobit.example.SiblingClass.SiblingInner

class FirstClass {
FirstClass() {
new SiblingInner()
}
}

Jenkinsfile

@​Library('pipelineUtilities@​mkobit-global-cps-test')

import jenkins.mkobit.example.FirstClass

def firstClass = new FirstClass()

Result: FAILURE - I thought this might help out by forcing compilation.

```
BUG! exception in phase 'semantic analysis' in source unit 'WorkflowScript' The lookup for jenkins.mkobit.example.FirstClass caused a failed compilaton. There should not have been any compilation from this call.
at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:190)
at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:170)
at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:126)
at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:676)
at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:308)
at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1218)
at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:176)
at org.codehaus.groovy.control.CompilationUnit$11.call(CompilationUnit.java:651)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:931)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:542)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:429)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:392)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:221)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:405)
Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/var/jenkins_home/jobs/ff/builds/30/libs/pipelineUtilities/src/jenkins/mkobit/example/FirstClass.groovy: 3: unable to resolve class jenkins.mkobit.example.SiblingClass.SiblingInner
@ line 3, column 1.
import jenkins.mkobit.example.SiblingClass.SiblingInner

```

FirstClass creates an instance of sibling static nested class when class is imported in Jenkinsfile

jenkins.mkobit.example.FirstClass

package jenkins.mkobit.example

class FirstClass {
FirstClass() {
new SiblingClass.SiblingInner()
}
}

Jenkinsfile

@​Library('pipelineUtilities@​mkobit-global-cps-test')

import jenkins.mkobit.example.SiblingClass
import jenkins.mkobit.example.FirstClass

def firstClass = new FirstClass()

Result: FAILURE This also fails

```
BUG! exception in phase 'semantic analysis' in source unit 'WorkflowScript' The lookup for jenkins.mkobit.example.FirstClass caused a failed compilaton. There should not have been any compilation from this call.
at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:190)
at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:170)
at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:126)
at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:676)
at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:308)
at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1218)
at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:176)
at org.codehaus.groovy.control.CompilationUnit$11.call(CompilationUnit.java:651)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:931)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:542)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:429)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:392)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:221)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:405)
Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/var/jenkins_home/jobs/ff/builds/37/libs/pipelineUtilities/src/jenkins/mkobit/example/FirstClass.groovy: 5: unable to resolve class SiblingClass.SiblingInner
@ line 5, column 5.
new SiblingClass.SiblingInner()
^

1 error

at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:946)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:542)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:254)
at groovy.lang.GroovyClassLoader.recompile(GroovyClassLoader.java:761)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:718)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:787)
at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:677)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:545)
at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:185)
... 20 more
Finished: FAILURE

```

---
Originally reported by mkobit, imported from: Static nested classes in global libraries can not be used from other classes in same package


  • status: Open
  • priority: Minor
  • component(s): workflow-cps-global-lib-plugin, workflow-cps-plugin
  • resolution: Unresolved
  • votes: 9
  • watchers: 11
  • imported: 2025-12-07

Raw content of original issue


Baseline global Library code:

Here is the base code for the example.
I will add to each example where I change the code.

jenkins.mkobit.example.FirstClass



package jenkins.mkobit.example

class FirstClass {
FirstClass() {
}
}



jenkins.mkobit.example.SiblingClass



package jenkins.mkobit.example

class SiblingClass {
static class SiblingInner {
}
}



Jenkinsfile examples:

FirstClass creates an instance of sibling class

jenkins.mkobit.example.FirstClass



package jenkins.mkobit.example

class FirstClass {
FirstClass() {
new SiblingClass()
}
}


Jenkinsfile



@Library('pipelineUtilities@mkobit-global-cps-test')

import jenkins.mkobit.example.FirstClass

def firstClass = new FirstClass()


Result: SUCCESS

FirstClass creates an instance of sibling static nested class in constructor

jenkins.mkobit.example.FirstClass



package jenkins.mkobit.example

class FirstClass {
FirstClass() {
new SiblingClass.SiblingInner()
}
}


Jenkinsfile



@Library('pipelineUtilities@mkobit-global-cps-test')

import jenkins.mkobit.example.FirstClass

def firstClass = new FirstClass()


Result: FAILURE - I expect this to work similarly to how normal Groovy code works. Instead, I get a failed compilation issue.


BUG! exception in phase 'semantic analysis' in source unit 'WorkflowScript' The lookup for jenkins.mkobit.example.FirstClass caused a failed compilaton. There should not have been any compilation from this call.

at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:190)
at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:170)
at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:126)
at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:676)
at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:308)
at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1218)
at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:176)
at org.codehaus.groovy.control.CompilationUnit$11.call(CompilationUnit.java:651)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:931)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:542)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:429)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:392)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:221)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:405)
Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/var/jenkins_home/jobs/ff/builds/29/libs/pipelineUtilities/src/jenkins/mkobit/example/FirstClass.groovy: 5: unable to resolve class SiblingClass.SiblingInner
@ line 5, column 5.
new SiblingClass.SiblingInner()

FirstClass creates an instance of sibling static nested class when full classname imported in classfile

jenkins.mkobit.example.FirstClass



package jenkins.mkobit.example

import jenkins.mkobit.example.SiblingClass.SiblingInner

class FirstClass {
FirstClass() {
new SiblingInner()
}
}


Jenkinsfile



@Library('pipelineUtilities@mkobit-global-cps-test')

import jenkins.mkobit.example.FirstClass

def firstClass = new FirstClass()


Result: FAILURE - I thought this might help out by forcing compilation.


BUG! exception in phase 'semantic analysis' in source unit 'WorkflowScript' The lookup for jenkins.mkobit.example.FirstClass caused a failed compilaton. There should not have been any compilation from this call.

at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:190)
at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:170)
at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:126)
at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:676)
at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:308)
at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1218)
at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:176)
at org.codehaus.groovy.control.CompilationUnit$11.call(CompilationUnit.java:651)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:931)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:542)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:429)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:392)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:221)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:405)
Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/var/jenkins_home/jobs/ff/builds/30/libs/pipelineUtilities/src/jenkins/mkobit/example/FirstClass.groovy: 3: unable to resolve class jenkins.mkobit.example.SiblingClass.SiblingInner
@ line 3, column 1.
import jenkins.mkobit.example.SiblingClass.SiblingInner

FirstClass creates an instance of sibling static nested class when class is imported in Jenkinsfile

jenkins.mkobit.example.FirstClass



package jenkins.mkobit.example

class FirstClass {
FirstClass() {
new SiblingClass.SiblingInner()
}
}


Jenkinsfile



@Library('pipelineUtilities@mkobit-global-cps-test')

import jenkins.mkobit.example.SiblingClass
import jenkins.mkobit.example.FirstClass

def firstClass = new FirstClass()


Result: FAILURE This also fails


BUG! exception in phase 'semantic analysis' in source unit 'WorkflowScript' The lookup for jenkins.mkobit.example.FirstClass caused a failed compilaton. There should not have been any compilation from this call.

at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:190)
at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:170)
at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:126)
at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:676)
at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:308)
at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1218)
at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:176)
at org.codehaus.groovy.control.CompilationUnit$11.call(CompilationUnit.java:651)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:931)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:542)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:429)
at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:392)
at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:221)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:405)
Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/var/jenkins_home/jobs/ff/builds/37/libs/pipelineUtilities/src/jenkins/mkobit/example/FirstClass.groovy: 5: unable to resolve class SiblingClass.SiblingInner
@ line 5, column 5.
new SiblingClass.SiblingInner()
^

1 error

at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:946)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:542)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:254)
at groovy.lang.GroovyClassLoader.recompile(GroovyClassLoader.java:761)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:718)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:787)
at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:677)
at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:545)
at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:185)
... 20 more
Finished: FAILURE


environment

```
2.5 shared libraries - https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Shared+Groovy+Libraries+Plugin

2.26 groovy - https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Groovy+Plugin
```

Contributor guide

Open the contributing guide

Research direction

Reproduce the failure with the FirstClass.groovy, SiblingClass.groovy, and Jenkinsfile examples in the issue. Start by tracing the reported path through CpsGroovyShell, CpsFlowExecution, and Groovy class resolution. Done means a class in the same package can instantiate SiblingClass.SiblingInner from a global library without the shown compilation error.

Written by the indexing model from the issue text.

Assessment

Tech stack
groovy, java
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.